Advertisement
Guest User

Untitled

a guest
Jul 21st, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.58 KB | None | 0 0
  1. struct node1{
  2.     int l,r;
  3.     ll sum;
  4.     node1 *lft,*rgt;
  5.     inline int mid(){return(l+r)>>1;}
  6.     node1(int l, int r){
  7.         this->l = l, this->r = r;
  8.         this->sum = 0, lft = rgt = 0;
  9.     }
  10.     void create_needed(){
  11.         if(!lft) lft = new node1(l,mid());
  12.         if(!rgt) rgt = new node1(mid()+1,r);
  13.     }
  14.     void update(int pos, ll v){
  15.         if(l == r){
  16.             sum+=v;
  17.             return;
  18.         }
  19.         create_needed();
  20.         int mid = (l+r)>>1;
  21.         if(pos <= mid) lft->update(pos,v);
  22.         else rgt->update(pos,v);
  23.         sum = lft->sum+rgt->sum;
  24.     }
  25.     ll query(int l, int r){
  26.         if(this->l == l && this->r == r) return sum;
  27.         create_needed();
  28.         int mid = (this->l+this->r)>>1;
  29.         if(r <= mid) return lft->query(l,r);
  30.         else if(l > mid) return rgt->query(l,r);
  31.         return lft->query(l,mid)+rgt->query(mid+1,r);
  32.     }
  33. };
  34.  
  35. struct node2{
  36.     int l,r;
  37.     node1 *data;
  38.     node2 *lft,*rgt;
  39.     inline int mid(){return(l+r)>>1;}
  40.     node2(int l, int r){
  41.         this->l = l, this->r = r;
  42.         this->data = new node1(1,num_cols);
  43.         this->lft = this->rgt = 0;
  44.     }
  45.     void create_needed(){
  46.         if(!lft) lft = new node2(l,mid());
  47.         if(!rgt) rgt = new node2(mid()+1,r);
  48.     }
  49.     void update(int row, int col, ll v){
  50.         data->update(col,v);
  51.         if(l == r) return;
  52.         create_needed();
  53.         int mid = (l+r)>>1;
  54.         if(row <= mid) lft->update(row,col,v);
  55.         else rgt->update(row,col,v);
  56.     }
  57.     ll query(int rl, int rr, int cl, int cr){
  58.         if(l == rl && r == rr) return data->query(cl,cr);
  59.         create_needed();
  60.         int mid = (l+r)>>1;
  61.         if(rr <= mid) return lft->query(rl,rr,cl,cr);
  62.         else if(rl > mid) return rgt->query(rl,rr,cl,cr);
  63.         return lft->query(rl,mid,cl,cr)+rgt->query(mid+1,rr,cl,cr);
  64.     }
  65. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement