线段树,点修改,区间查询。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long LL;
const int maxn = 50000 + 20;
int n,a[maxn],sumv[maxn<<2],cas,x,y,t;
char s[10];
void build(int rt,int L,int R){
if(L == R){
sumv[rt] = a[L];
return ;
}
int mid = (L+R)/2;
build(rt<<1,L,mid);
build(rt<<1|1,mid+1,R);
sumv[rt] = sumv[rt<<1] + sumv[rt<<1|1];
}
void update(int rt,int L,int R,int x,int y){
if(L == R) {
sumv[rt] += y;
return ;
}
int mid = (L+R)/2;
if(x<=mid) update(rt<<1,L,mid,x,y);
else update(rt<<1|1,mid+1,R,x,y);
sumv[rt] = sumv[rt<<1] + sumv[rt<<1|1];
}
LL query(int rt,int L,int R,int x,int y){
if(x<=L&&R<=y) return sumv[rt];
LL ans = 0;
int mid = (L+R)/2;
if(x<=mid) ans += query(rt<<1,L,mid,x,y);
if(y>mid) ans += query(rt<<1|1,mid+1,R,x,y);
return ans;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i = 1;i<=n;i++)
scanf("%d",a+i);
build(1,1,n);
printf("Case %d:\n",++cas);
while(scanf("%s",s)&&strcmp(s,"End")){
scanf("%d%d",&x,&y);
if(!strcmp(s,"Add")) update(1,1,n,x,y);
else if(!strcmp(s,"Sub")) update(1,1,n,x,-y);
else printf("%lld\n",query(1,1,n,x,y));
}
}
return 0;
}