题目来源:
http://acm.hdu.edu.cn/showproblem.php?pid=1166
代码如下:
using namespace std ;
typedef long long LL;
const int Max_N=50010;
int cc[Max_N]; // 树状数组,有ci = A(i-lowbit(i)+1) + A(i-lowbit(i)+2)+ Ai
int n;// 数组A的个数,下标从1开始
int lowbit(int x){//lowbit 求的是 x的二进制表达式中最右边的1所对应的值
return x & -x;
}
void Add(int x, int value){// 数组元素Ax增加value值,需要修改的cc[]
while(x<=n){
cc[x]+=value;
x+=lowbit(x);
}
}
int Sum(int x){// 下标从1开始,到n, sum求的是 A1+A2+...+Ax之和
int ret=0;
while(x > 0)
{
ret+=cc[x];
x-=lowbit(x);
}
return ret;
}
int Getsum(int x1, int x2){ // 区间和
return Sum(x2)-Sum(x1-1);
}
void init(){ //复杂度为 n(logn) ,初始化树状数组
int tmp;
memset(cc,0,sizeof(cc));
for(int i=1; i<=n ;i++){
scanf("%d",&tmp);
Add(i,tmp);
}
}
int main(){
int t,a,b,k=1;
char s[10];
scanf("%d",&t);
while(t--){
printf("Case %d:\n",k++);
scanf("%d",&n);
init();
while(scanf("%s",s)){
if(!strcmp(s,"End"))
break;
scanf("%d%d",&a,&b);
if( !strcmp(s,"Query") )
printf("%d\n",Getsum(a,b));
else if( !strcmp(s,"Add") )
Add(a,b);
else
Add(a,-b);
}
}
return 0;
}