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;

}

你可能感兴趣的:(OJ)