Advertisement
Guest User

Dynamic Segment tree

a guest
Apr 22nd, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.61 KB | None | 0 0
  1.  
  2.  
  3. int n,q;
  4.  
  5. struct node{
  6.     node *left,*right;
  7.     ll lazy,sum;
  8.     node(){
  9.         left = right = NULL;
  10.         lazy = sum = 0;
  11.     }
  12. }*root;
  13.  
  14. ll Sum(ll l,ll r){
  15.     return (r*(r+1))/2 - (l*(l-1))/2;
  16. }
  17.  
  18. void checkLazy(node *curr,ll b,ll e){
  19.         if(curr->lazy!=0){
  20.         if(b!=e){
  21.             int mid = (b+e)>>1;
  22.             if(!curr->left)curr->left = new node();
  23.             if(!curr->right)curr->right = new node();
  24.             curr->left->sum-=(curr->lazy*(ll)(mid-b+1));
  25.             curr->right->sum-=(curr->lazy*(ll)(e-mid));
  26.             curr->left->lazy+=curr->lazy;
  27.             curr->right->lazy+=curr->lazy;
  28.         }
  29.         curr->lazy = 0;
  30.     }
  31. }
  32.  
  33. void update(node *curr,ll b,ll e,ll l,ll r,ll val){
  34.     checkLazy(curr,b,e);
  35.     if(l>e||b>r)return ;
  36.     if(b>=l&&e<=r){
  37.         curr->sum-=(val*(ll)(e-b+1));
  38.         curr->lazy+=val;
  39.         return ;
  40.     }
  41.     if(!curr->left)curr->left = new node();
  42.     if(!curr->right)curr->right = new node();
  43.     int mid = (b+e)>>1;
  44.     update(curr->left,b,mid,l,r,val);
  45.     update(curr->right,mid+1,e,l,r,val);
  46.     curr->sum = curr->left->sum + curr->right->sum;
  47. }
  48.  
  49. ll query(node *curr,ll b,ll e,ll l,ll r){
  50.     checkLazy(curr,b,e);
  51.     if(b>r||l>e)return 0;
  52.     if(b>=l&&e<=r)return curr->sum;
  53.     if(!curr->left)curr->left = new node();
  54.     if(!curr->right)curr->right = new node();
  55.     int mid = (b+e)>>1;
  56.     ll p1 = query(curr->left,b,mid,l,r);
  57.     ll p2 = query(curr->right,mid+1,e,l,r);
  58.     return p1 + p2;
  59. }
  60.  
  61.  
  62. int main()
  63. {
  64.     ///booster()
  65.     ///read("input.txt");
  66.     scani2(n,q);
  67.     root = new node();
  68.     while(q--){
  69.         int c,l,r;
  70.         scani3(c,l,r);
  71.         if(c==1){
  72.             int v;
  73.             scani(v);
  74.             update(root,1,MAX,l,r,v);
  75.         }
  76.         else printf("%lld\n",Sum(l,r) + query(root,1,MAX,l,r));
  77.     }
  78.  
  79.     return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement