Advertisement
Riz1Ahmed

Lazy Propagation (SPOJ - HORRIBLE)

Jan 30th, 2020
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.64 KB | None | 0 0
  1. /** Lazy Propagation (spoj.com/problems/HORRIBLE)
  2. Given an N size Array (initially 0) and Q query.
  3. There have 2 Type of Query.
  4. 0 l r v = Add v to range[l:r].
  5. 1 l r = Print sun of range[l:r].
  6. Note: 1-Based Index. **/
  7. #include<bits/stdc++.h>
  8. using namespace std;
  9. using ll=long long int;
  10. struct R{ll v,prop;};
  11. const ll MX=1e5;
  12. R tree[MX*3+5];
  13. ll arr[MX+5];
  14.  
  15. void init(ll node, ll b, ll e){
  16.     if (b==e){
  17.         tree[node]={0,0};
  18.         return;
  19.     }
  20.     ll left=node*2;
  21.     ll mid=(b+e)/2;
  22.     ll right=node*2+1;
  23.     init(left,b,mid);
  24.     init(right,mid+1,e);
  25.     tree[node]={tree[left].v+tree[right].v, 0};
  26. }
  27. void update(ll node, ll b, ll e, ll l,ll r,ll v){
  28.     if (e<l || b>r) return;
  29.     if (b>=l && e<=r){
  30.         tree[node].prop+=v;
  31.         tree[node].v += v*(e-b+1);
  32.         return;
  33.     }
  34.     ll mid=(b+e)/2;
  35.     ll left=node*2;
  36.     ll right=node*2+1;
  37.     update(left,b,mid,l,r,v);
  38.     update(right,mid+1,e,l,r,v);
  39.     tree[node].v = tree[left].v + tree[right].v + tree[node].prop*(e-b+1);
  40. }
  41. ll query(ll node, ll b, ll e, ll l, ll r, ll c){
  42.     if (b>=l && e<=r)
  43.         return tree[node].v + c*(e-b+1);
  44.     if (e<l || b>r) return 0;
  45.     ll mid=(b+e)/2;
  46.     ll left=node*2;
  47.     ll right=node*2+1;
  48.     ll mxl=query(left,b,mid,l,r,c+tree[node].prop);
  49.     ll mxr=query(right,mid+1,e,l,r,c+tree[node].prop);
  50.     return mxl+mxr;
  51. }
  52. int main(){
  53.     ll t,n,q,type,l,r,val; scanf("%*d");
  54.     while (~scanf("%lld %lld",&n,&q)){
  55.         memset(arr,0,sizeof arr[0]*(n+5));
  56.         init(1,1,n);
  57.         for (int i=0; i<q; i++){
  58.             scanf("%lld",&type);
  59.             if (!type){
  60.                 scanf("%lld %lld %lld",&l,&r,&val);
  61.                 update(1,1,n,l,r,val);
  62.             }else{
  63.                 scanf("%lld %lld",&l,&r);
  64.                 printf("%lld\n",query(1,1,n,l,r,0));
  65.             }
  66.         }
  67.     }
  68.     return 0;
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement