树状数组图解
#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; }