Description
Input
Output
Sample Input
1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Sample Output
Case 1: 6 33 59
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<string> #include<algorithm> #define LL long long #define inf 0x3f3f3f3f using namespace std; struct node { int l,r; int w; }t[200040]; int num[50010]; void build(int id,int l,int r) { t[id].l=l; t[id].r=r; if(l==r) { t[id].w=num[l]; return ; } int mid=(l+r)/2; build(2*id,l,(l+r)/2); build(2*id+1,(l+r)/2+1,r); t[id].w=t[2*id].w+t[2*id+1].w; } void update(int id,int k,int nm) { if(t[id].l==k&&t[id].r==k) { t[id].w=nm; return ; } int mid=(t[id].l+t[id].r)/2; if(k<=mid) update(2*id,k,nm); else update(2*id+1,k,nm); t[id].w=t[2*id].w+t[2*id+1].w; } int query(int id,int a,int b) { if(t[id].l==a&&t[id].r==b) return t[id].w; int mid=(t[id].l+t[id].r)/2; if(b<=mid) return query(2*id,a,b); else if(a>=mid+1) return query(2*id+1,a,b); else return query(2*id,a,mid)+query(2*id+1,mid+1,b); } int main() { int T; cin>>T; int casex=1; while(T--) { int n; cin>>n; for(int i=1;i<=n;i++) scanf("%d",&num[i]); build(1,1,n); cout<<"Case "<<casex++<<":"<<endl; string str; while(cin>>str) { if(str=="End") break; if(str=="Query") { int a,b; scanf("%d%d",&a,&b); cout<<query(1,a,b)<<endl; } if(str=="Add") { int k,val; scanf("%d%d",&k,&val); update(1,k,num[k]+val); num[k]=num[k]+val; } if(str=="Sub") { int k,val; scanf("%d%d",&k,&val); update(1,k,num[k]-val); num[k]=num[k]-val; } } } return 0; }