Advertisement
istinishat

lazy segment tree

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