Morass

Robin Hood

Aug 30th, 2016
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define LL long long
  4. void build(LL int ar[],LL int seg[],LL int node,LL int b,LL int e){
  5.     if(b==e){
  6.         seg[node]=ar[b];
  7.         return;
  8.     }
  9.     LL int Left=node*2+1;
  10.     LL int Right=node*2+2;
  11.     LL int mid=(b+e)/2;
  12.     build(ar,seg,Left,b,mid);
  13.     build(ar,seg,Right,mid+1,e);
  14.     seg[node]=seg[Left]+seg[Right];
  15. }
  16. LL int query(LL int seg[],LL int node,LL int b,LL int e,LL int i,LL int j){
  17.     if(i>e||j<b) return 0;
  18.     if(b>=i&&e<=j) return seg[node];
  19.     LL int Left=node*2+1;
  20.     LL int Right=node*2+2;
  21.     LL int mid=(b+e)/2;
  22.     return query(seg,Left,b,mid,i,j)+query(seg,Right,mid+1,e,i,j);
  23. }
  24. void update(LL int seg[],LL int node,LL int b,LL int e,LL int i,LL int newvalue){
  25.     if(i>e||i<b)return;
  26.     if(b>=i&&e<=i){
  27.         seg[node]=newvalue;
  28.         return;
  29.     }
  30.     LL int Left=node*2+1;
  31.     LL int Right=node*2+2;
  32.     LL int mid=(b+e)/2;
  33.     update(seg,Left,b,mid,i,newvalue);
  34.     update(seg,Right,mid+1,e,i,newvalue);
  35.     seg[node]=seg[Left]+seg[Right];
  36. }
  37. LL int a[1<<20];
  38. LL int seg[1<<19];
  39. int  main(){
  40.     //freopen("in.txt","r",stdin);
  41.     //freopen("out.txt","w",stdout);
  42.     int  t;
  43.     scanf("%d",&t);
  44.     for(int i=1;i<=t;i++){
  45.         printf("Case %d:\n",i);
  46.         LL int  n,q;
  47.         scanf("%lld%lld",&n,&q);
  48.         for(int j=0;j<n;j++){
  49.             scanf("%lld",&a[j]);
  50.         }
  51.         build(a,seg,0,0,n-1);
  52.         for(int j=0;j<q;j++){
  53.             LL int t1,ii,jj;
  54.             scanf("%lld",&t1);
  55.             if(t1==1){
  56.                 scanf("%lld",&ii);
  57.                 printf("%lld\n",a[ii]);
  58.                 update(seg,0,0,n-1,ii,0);
  59.                 a[ii]=0;
  60.             }
  61.             else if(t1==2){
  62.                 scanf("%lld%lld",&ii,&jj);
  63.                 update(seg,0,0,n-1,ii,jj+a[ii]);
  64.                 a[ii]+=jj;
  65.             }
  66.             else{
  67.                 scanf("%lld%lld",&ii,&jj);
  68.                 printf("%lld\n",query(seg,0,0,n-1,ii,jj));
  69.             }
  70.         }
  71.     }
  72. }
Advertisement
Add Comment
Please, Sign In to add comment