Advertisement
Jasir

Lazy propagation

May 6th, 2018 (edited)
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.56 KB | None | 0 0
  1. struct treeNode {
  2.     int prop;
  3.     int sum;
  4. };
  5.  
  6. treeNode tree[mx];
  7.  
  8. void update(int node, int b, int e, int i, int j, int val, int idx){
  9.     if(tree[idx][node].prop!=0){
  10.         int tp = tree[idx][node].prop;
  11.         tree[idx][node].prop = 0;
  12.         tree[idx][node].sum += tp*(e-b+1);
  13.         if(b!=e){
  14.             tree[idx][node*2].prop += tp;
  15.             tree[idx][node*2+1].prop += tp;
  16.         }
  17.     }
  18.     if (i > e || j < b)
  19.         return;
  20.     if (b >= i && e <= j){
  21.         tree[idx][node].sum += val*(e-b+1);
  22.         if(b!=e){
  23.             tree[idx][node*2].prop += val;
  24.             tree[idx][node*2+1].prop += val;
  25.         }
  26.         return;
  27.     }
  28.     int Left = node * 2;
  29.     int Right = (node * 2) + 1;
  30.     int mid = (b + e) / 2;
  31.     update(Left, b, mid, i, j, val, idx);
  32.     update(Right, mid + 1, e, i, j, val, idx);
  33.     tree[idx][node].sum = tree[idx][Left].sum + tree[idx][Right].sum;
  34. }
  35.  
  36. int query(int node, int b, int e, int i, int j, int idx){
  37.     if(tree[idx][node].prop!=0){
  38.         int tp = tree[idx][node].prop;
  39.         tree[idx][node].prop = 0;
  40.         tree[idx][node].sum += tp*(e-b+1);
  41.         if(b!=e){
  42.             tree[idx][node*2].prop += tp;
  43.             tree[idx][node*2+1].prop += tp;
  44.         }
  45.     }
  46.     if (i > e || j < b)
  47.         return 0;
  48.  
  49.     if (b >= i and e <= j)
  50.         return tree[idx][node].sum;
  51.  
  52.     int Left = node << 1;
  53.     int Right = (node << 1) + 1;
  54.     int mid = (b + e) >> 1;
  55.  
  56.     int p1 = query(Left, b, mid, i, j, idx);
  57.     int p2 = query(Right, mid + 1, e, i, j, idx);
  58.  
  59.     return p1 + p2;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement