树状数组Hdu1166
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> #include <stack> #include <queue> #include <vector> #include <map> #include <string> #include <iostream> using namespace std; int c[222222]; int n; int lowbit(int x) { return x&(-x); } int sum(int n) { int sum=0; while(n>0){ sum+=c[n]; n-=lowbit(n); } return sum; } void change(int k,int add) { while(k<=n){ c[k]+=add; k+=lowbit(k); } } int main() { int t; char str[100];int pos,add,l,r; scanf("%d",&t); for(int i=1;i<=t;i++){ memset(c,0,sizeof(c)); scanf("%d",&n); for(int i=1;i<=n;i++){ int ret;scanf("%d",&ret); change(i,ret); } printf("Case %d:\n",i); for(;;){ scanf("%s",str); if(strcmp(str,"End")==0) break; if(strcmp(str,"Add")==0){ scanf("%d%d",&pos,&add); change(pos,add); } if(strcmp(str,"Query")==0){ scanf("%d%d",&l,&r); printf("%d\n",sum(r)-sum(l-1)); } if(strcmp(str,"Sub")==0){ cin>>pos>>add; change(pos,-add); } } } return 0; }