来源:HDU1166
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
const int MAXN = 50000+10;
int tree[MAXN<<2],a[MAXN];
int n;
char ch[10];
void pushup(int rt){
tree[rt] = tree[lson] + tree[rson];
}
void build(int rt,int l,int r){
if(l == r){
tree[rt] = a[l];
return ;
}
int mid = (l+r)>>1;
build(lson,l,mid);
build(rson,mid+1,r);
pushup(rt);
}
void update(int rt,int l,int r,int pos,int data){
//cout<<l<<" "<<r<<" "<<pos<<endl;
if(l == pos && pos == r){
tree[rt] += data;
return ;
}
int mid = (l+r)>>1;
if(pos<=mid) update(lson,l,mid,pos,data);
else update(rson,mid+1,r,pos,data);
pushup(rt);
}
int query(int rt,int l,int r,int left,int right){
if(left<=l && r<=right){
return tree[rt];
}
int mid = (l+r)>>1;
int ans = 0;
if(left<=mid) ans+=query(lson,l,mid,left,right);
if(right>mid) ans+=query(rson,mid+1,r,left,right);
return ans;
}
int main(){
int T,nc=1;
scanf("%d",&T);
int x,y;
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",a+i);
build(1,1,n);
getchar();
cout<<"Case "<<nc++<<":"<<endl;
while(scanf("%s",ch)!=EOF){
//cout<<"ch : "<<ch<<endl;
if(ch[0] == 'E') break;
if(ch[0] == 'A'){
scanf("%d%d",&x,&y);
update(1,1,n,x,y);
}
if(ch[0] == 'Q'){
scanf("%d%d",&x,&y);
cout<<query(1,1,n,x,y)<<endl;
}
if(ch[0] == 'S'){
scanf("%d%d",&x,&y);
update(1,1,n,x,-y);
}
}
}
return 0;
}