很裸的一道树状数组或者线段树题
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=2e5+10;
int C[maxn],x[maxn],n;
int lowbit(int x){return x&(-x);}
int sum(int x){
int ret=0;
while(x>0){
ret+=C[x];x-=lowbit(x);
}
return ret;
}
void add(int x,int v){
while(x<=n){
C[x]+=v;
x+=lowbit(x);
}
}
int main()
{
//freopen("G:\\input.txt","r",stdin);
int cas=1;
while(scanf("%d",&n)&&n){
memset(C,0,sizeof(C));
for(int i=1;i<=n;i++){
scanf("%d",&x[i]);
add(i,x[i]);
}
if(cas>1)printf("\n");
printf("Case %d:\n",cas++);
char op[10];
int a,b;
while(scanf("%s",op)){
if(op[0]=='E')break;
scanf("%d%d",&a,&b);
if(op[0]=='S'){
add(a,b-x[a]);
x[a]=b;
}else if(op[0]=='M'){
printf("%d\n",sum(b)-sum(a-1));
}
}
}
return 0;
}