Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define mx 1000001
- int arr[mx];
- int tree[mx*3];
- void init(int node,int b,int e)
- {
- if(b==e)
- {
- tree[node]=arr[b];
- return;
- }
- int Left=node*2;
- int Right=node*2+1;
- int mid=(b+e)/2;
- init(Left,b,mid);
- init(Right,mid+1,e);
- tree[node]=tree[Left]+tree[Right];
- }
- int query(int node,int b,int e,int i,int j)
- {
- if(i>e||j<b)
- return 0;
- if(b>=i && e<=j)
- return tree[node];
- int Left=node*2;
- int Right=node*2+1;
- int mid=(b+e)/2;
- int p1=query(Left,b,mid,i,j);
- int p2=query(Right,mid+1,e,i,j);
- return p1+p2;
- }
- void update(int node,int b,int e,int i,int newvalue)
- {
- if(i>e||i<b)
- return;
- if(b>=i&&e<=i)
- {
- tree[node]=newvalue;
- return;
- }
- int Left=node*2;
- int Right=node*2+1;
- int mid=(b+e)/2;
- update(Left,b,mid,i,newvalue);
- update(Right,mid+1,e,i,newvalue);
- tree[node]=tree[Left]+tree[Right];
- }
- int main()
- {
- int n,cnt=1;
- while(scanf("%d",&n) && n!=0)
- {
- for(int i=1; i<=n; i++)
- {
- scanf("%d",&arr[i]);
- }
- printf("Case %d:\n",cnt++);
- getchar();
- init(1,1,n);
- char s[5];
- while(scanf("%s",s)==1)
- {
- if(s[0]=='E')
- {
- break;
- }
- else if(s[0]=='M')
- {
- int a,b;
- scanf("%d%d",&a,&b);
- int ans = query(1,1,n,a,b) ;
- printf("%d\n",ans);
- }
- else
- {
- int a,b;
- scanf("%d%d",&a,&b);
- update(1,1,n,a,b);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement