Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- struct treeNode {
- int prop;
- int sum;
- };
- treeNode tree[mx];
- void update(int node, int b, int e, int i, int j, int val, int idx){
- if(tree[idx][node].prop!=0){
- int tp = tree[idx][node].prop;
- tree[idx][node].prop = 0;
- tree[idx][node].sum += tp*(e-b+1);
- if(b!=e){
- tree[idx][node*2].prop += tp;
- tree[idx][node*2+1].prop += tp;
- }
- }
- if (i > e || j < b)
- return;
- if (b >= i && e <= j){
- tree[idx][node].sum += val*(e-b+1);
- if(b!=e){
- tree[idx][node*2].prop += val;
- tree[idx][node*2+1].prop += val;
- }
- return;
- }
- int Left = node * 2;
- int Right = (node * 2) + 1;
- int mid = (b + e) / 2;
- update(Left, b, mid, i, j, val, idx);
- update(Right, mid + 1, e, i, j, val, idx);
- tree[idx][node].sum = tree[idx][Left].sum + tree[idx][Right].sum;
- }
- int query(int node, int b, int e, int i, int j, int idx){
- if(tree[idx][node].prop!=0){
- int tp = tree[idx][node].prop;
- tree[idx][node].prop = 0;
- tree[idx][node].sum += tp*(e-b+1);
- if(b!=e){
- tree[idx][node*2].prop += tp;
- tree[idx][node*2+1].prop += tp;
- }
- }
- if (i > e || j < b)
- return 0;
- if (b >= i and e <= j)
- return tree[idx][node].sum;
- int Left = node << 1;
- int Right = (node << 1) + 1;
- int mid = (b + e) >> 1;
- int p1 = query(Left, b, mid, i, j, idx);
- int p2 = query(Right, mid + 1, e, i, j, idx);
- return p1 + p2;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement