来源: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];
int arr[MAXN];
int n;
char ch[20];
void pushup(int rt){
tree[rt] = tree[lson]+tree[rson];
}
void build(int rt,int l,int r){
if(l == r){
tree[rt] = arr[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){
if(l == r && l == pos){
tree[rt] += data;
return ;
}
int mid = l+r>>1;
if(pos<=mid) update(lson,l,mid,pos,data);
else if(pos>mid) update(rson,mid+1,r,pos,data);
pushup(rt);
}
int query(int rt,int l,int r,int left,int right){
//cout<<rt<<" "<<l<<" "<<r<<" "<<left<<" "<<right<<endl;
if(left<=l && r<=right){
return tree[rt];
}
int mid = l+r>>1;
int res = 0;
if(left<=mid) res+=query(lson,l,mid,left,right);
if(right>mid) res+=query(rson,mid+1,r,left,right);
return res;
}
int main(){
int T;
int nc = 1;
scanf("%d",&T);
while(T--){
memset(tree,0,sizeof(tree));
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",arr+i);
}
build(1,1,n);
printf("Case %d:\n",nc++);
while(scanf("%s",ch)){
if(ch[0]=='E') break;
if(ch[0]=='A'){
int x,y;
scanf("%d%d",&x,&y);
update(1,1,n,x,y);
}
if(ch[0]=='Q'){
int x,y;
scanf("%d%d",&x,&y);
if(x>y) swap(x,y);
cout<<query(1,1,n,x,y)<<endl;
}
if(ch[0]=='S'){
int x,y;
scanf("%d%d",&x,&y);
update(1,1,n,x,-y);
}
}
}
return 0;
}