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;
}