题目来源:

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;
}