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

树状数组的入门题。。s[N]表示当前下标控制的所有元素的和。。。

对于p-lowbit(p)都不被p包含。。

而对于p+lowbit(p) 都包含p。。。。。

#include<iostream>
#include<string.h>
#include<string>
#include<cstdio>
#define N 50005
using namespace std;
int s[N];
int lowbit(int x)
{return x&(-x);}
void update(int x,int a)
{
    while(x<N)
  {   s[x]+=a;
    x+=lowbit(x);
  }
}
int Quary(int x)
{ int sum=0;
   while(x>0)
   { sum+=s[x];
     x-=lowbit(x);
   }
   return sum;
}
int main()
{ int T;
  scanf("%d",&T);
    for(int k=1;k<=T;++k)
    {  memset(s,0,sizeof(s));
        int n,a,b;
        int tot=0;
       scanf("%d",&n);
       for(int i=1;i<=n;++i)
       { int a;
        scanf("%d",&a);
         update(i,a);
       }
       printf("Case %d:\n",k);
       char s1[10];
       while(scanf("%s",s1),strcmp(s1,"End"))
       { scanf("%d%d",&a,&b);
       if(s1[0]=='E') break;
       else if(s1[0]=='A')  update(a,b);
       else if(s1[0]=='S')update(a,-b);
       else  printf("%d\n",Quary(b)-Quary(a-1));
         }
    }return 0;
}


你可能感兴趣的:(http://acm.hdu.edu.cn/showproblem.php?pid=1166)