树状数组Hdu1166

#include <cstdio>

#include <cstdlib>

#include <cstring>

#include <algorithm>

#include <cmath>

#include <stack>

#include <queue>

#include <vector>

#include <map>

#include <string>

#include <iostream>

using namespace std;

int c[222222];

int n;

int lowbit(int x)

{

    return x&(-x);

}



int sum(int n)

{

    int sum=0;

    while(n>0){

        sum+=c[n];

        n-=lowbit(n);

    }

    return sum;

}



void change(int k,int add)

{

    while(k<=n){

        c[k]+=add;

        k+=lowbit(k);

    }

}

int main()

{

    int t;

    char str[100];int pos,add,l,r;

    scanf("%d",&t);

    for(int i=1;i<=t;i++){

        memset(c,0,sizeof(c));

        scanf("%d",&n);

        for(int i=1;i<=n;i++){

            int ret;scanf("%d",&ret);

            change(i,ret);

        }

        printf("Case %d:\n",i);

        for(;;){

            scanf("%s",str);

            if(strcmp(str,"End")==0)

                break;

            if(strcmp(str,"Add")==0){

                scanf("%d%d",&pos,&add);

                change(pos,add);

            }

            if(strcmp(str,"Query")==0){

                scanf("%d%d",&l,&r);

                printf("%d\n",sum(r)-sum(l-1));

            }

            if(strcmp(str,"Sub")==0){

                cin>>pos>>add;

                change(pos,-add);

            }

        }

    }

    return 0;

}

  

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