Advertisement
istinishat

Lazy segment tree

May 18th, 2017
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5.  
  6. #define si(n) scanf("%d",&n)
  7. #define MAX 100005
  8.  
  9. long long arr[MAX],tree[4*MAX],lazy[4*MAX];
  10.  
  11. void update(int node,int tl,int tr,int l,int r,int val){
  12.     //
  13.     if(lazy[node]){
  14.         tree[node]+=(tr-tl+1)*lazy[node];
  15.  
  16.         if (tl != tr){
  17.             lazy[node*2]+=lazy[node];
  18.             lazy[node*2+1]+=lazy[node];
  19.         }
  20.         lazy[node]=0;
  21.     }
  22.  
  23.     if(tl>tr || tl>r || tr<l){
  24.         //cout<<"here"<<endl;
  25.         return ;
  26.     }
  27.     if(tl>=l && tr<=r){
  28.         tree[node]+=(tr-tl+1)*val;
  29.         if(tl != tr){
  30.             lazy[node*2]+=val;
  31.             lazy[node*2+1]+=val;
  32.         }
  33.         return ;
  34.     }
  35.     int mid=(tl+tr)/2;
  36.     //cout<<mid<<endl;
  37.     update(node*2,tl,mid,l,r,val);
  38.     update(node*2+1,mid+1,tr,l,r,val);
  39.  
  40.     tree[node]=tree[node*2]+tree[node*2+1];
  41. }
  42.  
  43. long long  sum(int node,int tl,int tr,int l,int r){
  44.     if(tl>tr || tl>r || tr<l)
  45.         return 0;
  46.     if(lazy[node]!=0){
  47.         tree[node]+=(tr-tl+1)*lazy[node];
  48.         if(tl != tr){
  49.             lazy[node*2]+=lazy[node];
  50.             lazy[node*2+1]+=lazy[node];
  51.         }
  52.         lazy[node]=0;
  53.     }
  54.     if(tl>=l && tr<=r)
  55.         return tree[node];
  56.     int mid=(tl+tr)/2;
  57.  
  58.     return sum(node*2,tl,mid,l,r)+
  59.         sum(node*2+1,mid+1,tr,l,r);
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement