最基本的树状数组操作,卡了半天,是因为为了节省几KB内存,树状数组用了short存,导致结果错误!!
#include<stdio.h> #include<string.h> short a[100005]; int c[100005],n; int lowbit(int i) { return i&(-i); } void add(int i,int v) { while (i<=n) { c[i]+=v; i+=lowbit(i); } } int sum(int i) { int s=0; while (i>0) { s+=c[i]; i-=lowbit(i); } return s; } int main() { int i,m,x,y,z,p,q; while(scanf("%d%d",&n,&m)==2) { memset(c,0,sizeof(c)); for(i=1;i<=n;i++) { scanf("%d",&a[i]); add(i,a[i]); } while(m--) { scanf("%d%d%d",&x,&y,&z); if(x-1) { p=z>y?z:y;q=z<y?z:y; printf("%d\n",sum(p)-sum(q-1)); } else { add(y,z-a[y]); a[y]=z; } } } return 0; }