树状数组图解
#include<string.h>
#include<stdio.h>
int m,n,c[1000005];
int xb(int x)//查找下标
{
return x&(x^(x-1));
}
int sum(int x)//求和
{
int sum=0;
while(x>0)
{
sum+=c[x];
x-=xb(x);
}
return sum;
}
void gb(int x,int y)//改变数据
{
for(int i=x;i<=m;i+=xb(i))
c[i]+=y;
}
int main()
{
scanf("%d%d",&m,&n);
int f,i,j,k;
/*memset(c,0,sizeof(c));*/
for(i=1;i<=m;i++)
{
scanf("%d",&f);
gb(i,f);
}
char s[8];
for(i=1;i<=n;i++)
{
scanf("%s",s);
scanf("%d%d",&k,&j);
if(strcmp(s,"QUERY")==0)
printf("%d\n",sum(j)-sum(k-1));
else if(strcmp(s,"ADD")==0)
gb(k,j);
}
return 0;
}