AC代码:
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 50005;
struct node{
int l,r,sum;
}tree[N<<2];
int a[N];
void build(int m,int l,int r){
tree[m].l = l;
tree[m].r = r;
if(l == r){
tree[m].sum = a[l];
return ;
}
int mid = (l+r)>>1;
build(m<<1,l,mid);
build((m<<1)|1,mid+1,r);
tree[m].sum = tree[m<<1].sum+tree[(m<<1)|1].sum;
}
void update(int m,int x,int val){
if(tree[m].l == x && tree[m].r == x){
tree[m].sum += val;
return ;
}
int mid = (tree[m].l+tree[m].r)>>1;
if(x <= mid)
update(m<<1,x,val);
else
update((m<<1)|1,x,val);
tree[m].sum = tree[m<<1].sum+tree[(m<<1)|1].sum;
}
int query(int m,int l,int r){
if(tree[m].l == l && tree[m].r == r)
return tree[m].sum;
int mid = (tree[m].l+tree[m].r)>>1;
if(r <= mid)
return query(m<<1,l,r);
if(l > mid)
return query((m<<1)|1,l,r);
return query(m<<1,l,mid)+query((m<<1)|1,mid+1,r);
}
int main(){
int T,t = 1;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
build(1,1,n);
printf("Case %d:\n",t++);
char op[10];
int x,y;
while(1){
scanf("%s",op);
if(op[0] == 'Q'){
scanf("%d%d",&x,&y);
printf("%d\n",query(1,x,y));
}
else if(op[0] == 'A'){
scanf("%d%d",&x,&y);
update(1,x,y);
}
else if(op[0] == 'S'){
scanf("%d%d",&x,&y);
update(1,x,-y);
}
else if(op[0] == 'E')
break;
}
}
return 0;
}