HDOJ 1166
2014-04-30 18:36
337 查看
#include<stdio.h> #include<string.h> #define MAX 50000 #define L(x) (x << 1) #define R(x) (x << 1|1) typedef struct { int left; int right; int sum; }Node; Node node[4*MAX]; int cnt; void build(int l,int r,int k) { node[k].left = l; node[k].right = r; node[k].sum = 0; if(l == r) return ; int mid = (l + r) >> 1; build(l,mid,L(k)); build(mid+1,r,R(k)); } void insert(int pos,int num,int k) { if(pos >= node[k].left && pos <= node[k].right) node[k].sum += num; if(node[k].left == node[k].right) return ; if(pos <= node[L(k)].right) insert(pos,num,L(k)); else insert(pos,num,R(k)); } void get_result(int l,int r,int k) { if(l == node[k].left && r == node[k].right) { cnt += node[k].sum; return ; } if(node[k].left == node[k].right) return ; if(r < node[R(k)].left) get_result(l,r,L(k)); else if(l > node[L(k)].right) get_result(l,r,R(k)); else { get_result(l,node[L(k)].right,L(k)); get_result(node[R(k)].left,r,R(k)); } } int main() { int T,n,i,j,k; char str[10]; scanf("%d",&T); k = 0; while(T--) { k ++; memset(str,0,sizeof(str)); scanf("%d",&n); build(1,n,1); for(i = 1;i <= n;i ++) { scanf("%d",&j); insert(i,j,1); } scanf("%s",str); int flag = 0; while(strcmp(str,"End")) { if(!strcmp(str,"Query") && !flag) { printf("Case %d:\n",k); flag = 1; } if(!strcmp(str,"Query")) { cnt = 0; scanf("%d%d",&i,&j); get_result(i,j,1); printf("%d\n",cnt); } if(!strcmp(str,"Add")) { scanf("%d%d",&i,&j); insert(i,j,1); } if(!strcmp(str,"Sub")) { scanf("%d%d",&i,&j); insert(i,-j,1); } memset(str,0,sizeof(str)); scanf("%s",str); } } return 0; }