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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| struct node{ int l,r; int sum; int tag; }tree[400005]; int arr[100005];
void build(int l, int r, int i=1){ tree[i].l = l; tree[i].r = r; if(tree[i].l == tree[i].r){ tree[i].sum = arr[l]; tree[i].tag = 0; return; } int mid = (l+r)>>1; build(l, mid, i<<1); build(mid+1, r, i<<1|1); tree[i].sum = tree[i<<1].sum + tree[i<<1|1].sum; tree[i].tag = 0; }
void lazy(int k, int i){ tree[i].sum += (tree[i].r - tree[i].l + 1) * k; tree[i].tag += k; } void down(int i){ lazy(tree[i].tag, i<<1); lazy(tree[i].tag, i<<1|1); tree[i].tag = 0; } void up(int i){ tree[i].sum = tree[i<<1].sum + tree[i<<1|1].sum; }
void add(int jobl, int jobr, int k, int i=1){ if(jobl <= tree[i].l && jobr >= tree[i].r){ lazy(k, i); return; } int mid = (tree[i].l+tree[i].r)>>1; if(jobr >= tree[i].l && jobl <= mid){ down(i); add(jobl, jobr, k, i<<1); } if(jobl <= tree[i].r && jobr >= mid+1){ down(i); add(jobl, jobr, k, i<<1|1); } up(i); }
int search(int jobl, int jobr, int i=1){ if(jobl <= tree[i].l && jobr >= tree[i].r){ return tree[i].sum; } int sum = 0; int mid = (tree[i].l+tree[i].r)>>1; if(jobr >= tree[i].l && jobl <= mid){ down(i); sum += search(jobl, jobr, i<<1); } if(jobl <= tree[i].r && jobr >= mid+1){ down(i); sum += search(jobl, jobr, i<<1|1); } return sum; }
|