1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #define Ls(x) x << 1 #define Rs(x) x << 1 | 1 int N = 1e5+5; vector<int> segTree(4*N), lazy(4*N) , arr(N); void build(int l, int r, int idx = 1){ if(l == r){ segTree[idx] = arr[l]; return; } int mid = (l+r) >> 1; build(l, mid, Ls(idx)); build(mid+1, r, Rs(idx)); segTree[idx] = segTree[Ls(idx)]+ segTree[Rs(idx)]; }
void pushDown(int l, int r, int idx){ if(lazy[idx] == 0) return; segTree[idx] += (r-l+1)*lazy[idx]; if(l != r) lazy[Ls(idx)] += lazy[idx],lazy[Rs(idx)] += lazy[idx]; lazy[idx] = 0; }
void update(int l, int r, int ql, int qr, int val, int idx = 1){ pushDown(l, r, idx); if(l > qr || r < ql) return; if(l >= ql && r <= qr){ segTree[idx] += (r-l+1)*val; if(l != r) lazy[Ls(idx)] += val, lazy[Rs(idx)] += val; return; } int mid = (l+r) >> 1; update(l, mid, ql, qr, val, Ls(idx)); update(mid+1, r, ql, qr, val, Rs(idx)); segTree[idx] = segTree[Ls(idx)]+ segTree[Rs(idx)]; }
int query(int l, int r, int ql, int qr, int idx = 1){ pushDown(l, r, idx); if(l > qr || r < ql) return 0; if(l >= ql && r <= qr) return segTree[idx]; int mid = (l+r) >> 1, sum = 0; if(ql <= mid) sum += query(l, mid, ql, qr, Ls(idx)); if(qr > mid) sum += query(mid+1, r, ql, qr, Rs(idx)); return sum; }
|