const int inf = 1e9+7; #define data _data struct data{ ll mx, mx_cnt, mx2, sum; constexpr data(ll m):mx(m), mx_cnt(1), mx2(-inf), sum(m) {} constexpr data(ll mx, ll mx_cnt, ll mx2, ll sum):mx(mx), mx_cnt(mx_cnt), mx2(mx2), sum(sum) {} }; data join(data A, data B) { if(A.mx == B.mx) return {A.mx, A.mx_cnt+B.mx_cnt, max(A.mx2, B.mx2), A.sum+B.sum}; if(A.mx < B.mx) swap(A, B); return {A.mx, A.mx_cnt, max(A.mx2, B.mx), A.sum+B.sum}; } using Seg = vector; void init(Seg& seg, int i, int s, int e, ll* A) { if(s == e) { seg[i] = A[s]; return; } int mid = (s+e)/2; init(seg, i*2, s, mid, A); init(seg, i*2+1, mid+1, e, A); seg[i] = join(seg[i*2], seg[i*2+1]); } void prop(Seg& seg, int i, int s, int e) { if(s == e) return; for(auto t : {i*2, i*2+1}) { if(seg[t].mx > seg[i].mx) { seg[t].sum -= seg[t].mx_cnt * (seg[t].mx - seg[i].mx); seg[t].mx = seg[i].mx; } } } void update(Seg& seg, int i, int s, int e, int a, int b, ll v) { prop(seg, i, s, e); if(e