HDOJ 1165 树状数组

次元传送门

本次用树状数组实现支持单个修改的区间和问题

感谢RYC兄的无私查错

代码实现

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;

const int L=50005;
int C[L],cases,n;

int Lowbit(int x){
    return x&(-x);
}

int Sum(int pos){
    int ans=0;
    while(pos>0){
        ans+=C[pos];
        pos-=Lowbit(pos);
    }
    return ans;
}

void Add(int pos,int x){
    while(pos<=n){
        C[pos]+=x;
        pos+=Lowbit(pos);
    }
}

int main(){
    scanf("%d",&cases);
    for(int c=1;c<=cases;c++){
        memset(C,0,sizeof(C));
        printf("Case %d:\n",c);
        scanf("%d",&n);
        for(int i=1,x;i<=n;i++){
            scanf("%d",&x);
            Add(i,x);
        }
        string str;
        while(cin>>str&&str[0]!='E'){
            if(str[0]=='Q'){
                int x,y;
                scanf("%d%d",&x,&y);
                printf("%d\n",Sum(y)-Sum(x-1));
            }
            else if(str[0]=='A'){
                int x,y;
                scanf("%d%d",&x,&y);
                Add(x,y);
            }
            else{
                int x,y;
                scanf("%d%d",&x,&y);
                Add(x,-y);
            }
        }
    }
    return 0;
}

By YOUSIKI

你可能感兴趣的:(HDOJ 1165 树状数组)