Advertisement
RaFiN_

persistent seg tree

Apr 4th, 2019
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.42 KB | None | 0 0
  1. int arr[MAX];
  2.  
  3. struct node{
  4.     node *left,*right;
  5.     int sum;
  6.     node(){
  7.         sum = 0;
  8.         left = right = NULL;
  9.     }
  10. }*root[MAX];
  11.  
  12. node* Build(int b,int e){
  13.     if(b==e){
  14.         node *ret = new node();
  15.         ret->sum = arr[b];
  16.         return ret;
  17.     }
  18.     int mid = (b+e)>>1;
  19.     node *ret = new node();
  20.     ret->left = Build(b,mid);
  21.     ret->right = Build(mid+1,e);
  22.     ret->sum = ret->left->sum + ret->right->sum;
  23.     return ret;
  24. }
  25.  
  26. node *update(node *ptr,int b,int e,int indx,int val){
  27.  
  28.     if(b>indx||indx>e)return ptr;
  29.     if(b==e){
  30.         node *ret = new node();
  31.         ret->sum = ptr->sum + val;
  32.         return ret;
  33.     }
  34.     int mid = (b+e)>>1;
  35.     node *ret = new node();
  36.     ret->left = update(ptr->left,b,mid,indx,val);
  37.     ret->right = update(ptr->right,mid+1,e,indx,val);
  38.     ret->sum = ret->left->sum + ret->right->sum;
  39.     return ret;
  40. }
  41.  
  42.  
  43. int query(node *ptr,int b,int e,int l,int r){
  44.     if(b>r||l>e)return 0;
  45.     if(b>=l&&e<=r)return ptr->sum;
  46.     int mid = (b+e)>>1;
  47.     return query(ptr->left,b,mid,l,r) + query(ptr->right,mid+1,e,l,r);
  48. }
  49.  
  50. int main()
  51. {
  52.     booster()
  53.     ///read("input.txt");
  54.  
  55.     int n;
  56.     cin>>n;
  57.     for(int i = 1;i<=n;i++)cin>>arr[i];
  58.     root[0] = Build(1,n);
  59.  
  60.     int q;
  61.     cin>>q;
  62.     int ajinka = 1;
  63.     while(q--){
  64.         int ch;
  65.         cin>>ch;
  66.         int idx;
  67.         int a,b;
  68.         cin>>idx>>a>>b;
  69.         if(ch==1){
  70.             root[ajinka] = update(root[idx],1,n,a,b);
  71.             ajinka++;
  72.         }
  73.         else cout<<query(root[idx],1,n,a,b)<<endl;
  74.     }
  75.  
  76.  
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement