BotByte

Lazy Propagation.cpp

Aug 27th, 2017
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.42 KB | None | 0 0
  1. /*  Lazy with propagation
  2.     Update : l r v
  3.              (add v from arr[l] to arr[r])
  4.     Query  : l r
  5.              (total sum from arr[l] to arr[r])
  6.     Sample Problem : LightOJ-1164 (Horrible Queries)
  7. */
  8.  
  9. #include <bits/stdc++.h>
  10.  
  11. using namespace std;
  12.  
  13. #define MAX 100005
  14. #define ll long long
  15. ll arr[MAX];
  16.  
  17. struct data {
  18.     ll val, prop;
  19. } tree[4*MAX];
  20.  
  21. void init(ll node, ll b, ll e)
  22. {
  23.     if(b == e){
  24.         tree[node].val = arr[b];
  25.         tree[node].prop = 0;
  26.         return;
  27.     }
  28.     ll left = 2*node;
  29.     ll right = 2*node + 1;
  30.     ll mid = (b+e)/2;
  31.     init(left, b, mid);
  32.     init(right, mid+1, e);
  33.     tree[node].val = tree[left].val + tree[right].val;
  34.     tree[node].prop = 0;
  35. }
  36.  
  37. void update(ll node, ll b, ll e, ll i, ll j, ll x)
  38. {
  39.     if(i > e || j < b) return;
  40.     if(b >= i && e <= j){
  41.         tree[node].val += (e-b+1) * x;
  42.         tree[node].prop += x;
  43.         return;
  44.     }
  45.     ll left = 2*node;
  46.     ll right = 2*node+1;
  47.     ll mid = (b+e)/2;
  48.     update(left, b, mid, i, j, x);
  49.     update(right, mid+1, e, i, j, x);
  50.     tree[node].val += tree[left].val + tree[right].val + (e-b+1)*tree[node].prop;
  51. }
  52.  
  53. ll query(ll node, ll b, ll e, ll i, ll j, ll carry)
  54. {
  55.     if(i > e || j < b) return 0;
  56.     if(b >= i && e <= j){
  57.         return tree[node].val+(e-b+1)*carry;
  58.     }
  59.     ll left = 2*node;
  60.     ll right = 2*node+1;
  61.     ll mid = (b+e)/2;
  62.     ll p = query(left, b, mid, i, j, carry+tree[node].prop);
  63.     ll q = query(right, mid+1, e, i, j, carry+tree[node].prop);
  64.     return p+q;
  65. }
  66.  
  67. int main()
  68. {
  69.     //freopen("in.txt", "r", stdin);
  70.     ll cases;
  71.     scanf("%lld", &cases);
  72.     ll caseno = 0;
  73.     while(cases--){
  74.         printf("Case %lld:\n", ++caseno);
  75.         ll n, q;
  76.         scanf("%lld %lld", &n, &q);
  77.         for(ll i=0; i<MAX; i++) arr[i] = 0;
  78.         //memset(arr, 0, sizeof arr);
  79.         init(1, 1, n);
  80.         for(int i=1; i<=q; i++){
  81.             ll type;
  82.             scanf("%lld", &type);
  83.             if(type == 0){
  84.                 ll x, y, v;
  85.                 scanf("%lld %lld %lld", &x, &y, &v);
  86.                 x++;
  87.                 y++;
  88.                 update(1, 1, n, x, y, v);
  89.             }
  90.             else {
  91.                 ll u, v;
  92.                 scanf("%lld %lld", &u, &v);
  93.                 u++;
  94.                 v++;
  95.                 ll res = query(1, 1, n, u, v, 0);
  96.                 printf("%lld\n", res);
  97.             }
  98.         }
  99.     }
  100. }
Advertisement
Add Comment
Please, Sign In to add comment