Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- long long int arr[1000005],tree[1000005];
- void buildtree(long long int node,long long int start,long long int e)
- {
- if(start==e)
- {
- tree[node]=arr[e];
- return;
- }
- long long int mid=(start+e)/2;
- long long int left=node*2;
- long long int right=left+1;
- buildtree(left,start,mid);
- buildtree(right,mid+1,e);
- tree[node]=tree[left]+tree[right];
- }
- void update(long long int node,long long int start,long long int e,long long int index,long long int value)
- {
- if(index>e||index<start)
- return;
- if(start==e)
- {
- // cout<<" before update "<<tree[node]<<endl;
- tree[node]=value;
- // cout<<"updated value "<<tree[node]<<endl;
- return;
- }
- long long int mid=(start+e)/2;
- long long int left=node*2;
- long long int right=left+1;
- update(left,start,mid,index,value);
- update(right,mid+1,e,index,value);
- tree[node]=tree[left]+tree[right];
- }
- long long int query(long long int node,long long int start,long long int e,long long int ranges,long long int rangef)
- {
- if(ranges>e||rangef<start)
- {
- return 0;
- }
- if(ranges<=start&&rangef>=e)
- {
- return tree[node];
- }
- long long int left=node*2;
- long long int right=left+1;
- long long int mid=(start+e)/2;
- long long int ans1=query(left,start,mid,ranges,rangef);
- long long int ans2=query(right,mid+1,e,ranges,rangef);
- return ans1+ans2;
- }
- int main()
- {
- long long int n,q,cas,t,index,value,rangef,ranges,ans,flag;
- scanf("%lld",&t);
- for(cas=1;cas<=t;cas++)
- {
- scanf("%lld %lld",&n,&q);
- for(int i=1;i<=n;i++)
- {
- scanf("%lld",&arr[i]);
- }
- buildtree(1,1,n);
- printf("Case %lld:\n",cas);
- while(q--)
- {
- scanf("%lld",&flag);
- if(flag==1)
- {
- scanf("%lld",&index);
- printf("%lld\n",arr[index+1]);
- arr[index+1]=0;
- update(1,1,n,index+1,0);
- }
- else if(flag==2)
- {
- scanf("%lld %lld",&index,&value);
- arr[index+1]=arr[index+1]+value;
- update(1,1,n,index+1,arr[index+1]);
- }
- else
- {
- scanf("%lld %lld",&ranges,&rangef);
- ans=query(1,1,n,ranges+1,rangef+1);
- printf("%lld\n",ans);
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement