这应该算是树状数组模板题吧!
题目:HDU:1166.点击此处进入!
这道题目比较简单,题意也好懂,我这里只贴个板子,不懂评论!
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=52005;//树组大小要比题目给的稍大,防止运行错误。
int m;
string s;
int a[N],c[N];
int sum(int t){
int y=0;
while(t>0){
y+=c[t];
t-=(t&(-t));
}
return y;
}
void updata(int p,int q){
while(p<=N){
c[p]+=q;
p+=(p&(-p));
}
}
int main(){
int aa;
scanf("%d",&aa);
for(int bb=1;bb<=aa;++bb){
printf("Case %d:\n",bb);
scanf("%d",&m);
int x,y;
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
for(int i=1;i<=m;++i){
scanf("%d",&a[i]);
updata(i,a[i]);
}
int flag=1;
while(flag){
cin>>s;//因为首字母不同,所以直接判断首字母更简洁!
if(s[0]!='E')scanf("%d%d",&x,&y);
if(s[0]=='A')updata(x,y);
if(s[0]=='S')updata(x,-y);
if(s[0]=='Q')printf("%d\n",sum(y)-sum(x-1));
if(s[0]=='E') flag=0;
}
}
return 0;
}