HDOJ1166(敌兵布阵)

维护一个整数序列,支持3种操作:

1、将指定的数加上一个值;

2、将指定的数减去一个值;

3、查询指定区间的和。

View Code
#include <stdio.h>
#define N 50001
int t,n,D;
int sum[4*N];
void init()
{
    int i;
    for(D=1;D<n+2;D<<=1);
    for(i=1;i<2*D;i++)  sum[i]=0;
    for(i=1;i<=n;i++)   scanf("%d",&sum[i+D]);
    for(i=D-1;i^1;i--)  sum[i]=sum[i<<1]+sum[i<<1|1];
}
void update(int x,int y)
{
    sum[x+D]+=y;
    for(x=x+D;x^1;x>>=1) sum[x>>1]=sum[x]+sum[x^1];
}
void get(int x,int y)
{
    int i=x+D-1,j=y+D+1,ret=0;
    for(;i^j^1;i>>=1,j>>=1)
    {
        if(~i&1)    ret+=sum[i^1];
        if(j&1) ret+=sum[j^1];
    }
    printf("%d\n",ret);
}
int main()
{
    int a,b,kase=0;
    char s[10];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        init();
        printf("Case %d:\n",++kase);
        while(1)
        {
            s[0]=0;
            while(s[0]!='A' && s[0]!='Q' && s[0]!='S' && s[0]!='E') scanf("%s",s);
            if(s[0]=='E')   break;
            scanf("%d%d",&a,&b);
            if(s[0]=='A')   update(a,b);
            else if(s[0]=='S')  update(a,-b);
            else    get(a,b);
        }
    }
    return 0;
}
posted @ 2012-07-11 16:43  BeatLJ  阅读(236)  评论(0编辑  收藏  举报