//http://acm.hdu.edu.cn/showproblem.php?pid=1166
//4671122 2011-09-28 13:02:52 Accepted 1166 31MS 412K 1396 B C++ nkhelloworld
//4671125 2011-09-28 13:03:32 Accepted 1166 62MS 376K 1396 B G++ nkhelloworld
//树状数组点更新求和,比线段树要快
#include <cstdio>
#include <cstring>
const int maxn = 50002;
int BITtree[maxn];
int maxval;

void BITinsert(int pos,int val)
{
    while(pos <=maxval)
    {
        BITtree[pos] += val;
        pos += (pos & -pos);
    }
}

int BITsum(int pos)
{
    int ret = 0;
    while(pos > 0)
    {
        ret += BITtree[pos];
        pos -= pos & -pos;
    }
    return ret;
}

int main()
{
    int totcase,numcase,i,j,tmp;
    scanf("%d",&totcase);
    char op[10];
    for(numcase = 1;numcase<=totcase;numcase++)
    {
        printf("Case %d:\n",numcase);
        scanf("%d",&maxval);
        memset(BITtree,0,sizeof(BITtree));
        for(i=1;i<=maxval;i++)
        {
            scanf("%d",&tmp);
            BITinsert(i,tmp);
        }
        while(scanf("%s",op))
        {
            if(op[0] == 'E')    break;
            scanf("%d%d",&i,&j);
            switch(op[0])
            {
                case 'Q':
                {
                    printf("%d\n",BITsum(j)-BITsum(i-1));
                    break;
                }
                case 'A':
                {
                    BITinsert(i,j);
                    break;
                }
                case 'S':
                {
                    BITinsert(i,-j);
                    break;
                }
            }
        }
    }
    return 0;
}

posted on 2011-09-28 13:41  NKHe!!oWor!d  阅读(152)  评论(0编辑  收藏  举报