HDU 1166 敌兵布阵(2)

http://acm.hdu.edu.cn/showproblem.php?pid=1166

老题新做,树状数组,比线段树省了300k内存

View Code
#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <math.h>

const int maxn=51000;

int s[maxn];

int nCase=1,n;

int lowbit(int i){return i&(-i);} 

void update(int i,int val)

{

    while(i<=n)

    {

        s[i]+=val;

        i+=lowbit(i);

    } 

}

int Sum(int i)

{

    int sum=0;

    while(i>0)

    {

        sum+=s[i];

        i-=lowbit(i);

    }

    return sum;  

}

int main()

{

    int t,i,val;

    scanf("%d",&t);

    while(t--)

    {

        memset(s,0,sizeof(s)); 

        scanf("%d",&n);

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

        {

            scanf("%d",&val);

            update(i,val);

        } 

        char op[10];

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

        while(scanf("%s",op))

        {

            if(op[0]=='E')break;

            int a,b;

            scanf("%d%d",&a,&b);

            if(op[0]=='A')update(a,b);

            else if(op[0]=='S')update(a,-b);

            else printf("%d\n",Sum(b)-Sum(a-1));

        }

    }

    return 0;

}

 

你可能感兴趣的:(HDU)