/* 线段树题 这题很简单,但是老是Runtime Error(ACCESS_VIOLATION) 一直找不到,就看着一老兄的,改我的代码 一直把他的函数都搬过来了,还是那样 就又把输入部分抄了过来,这才对了 原来是处理'\n'的时候出的错 但是在我的机器上一切正常 其实可以无视'\n'或用" %s"空白字符处理 */ #include<stdio.h> #include<string.h> struct node { int l,r,zhi; }e[200000]; int num=1,SUM; char s[20]; void jian(int i,int j,int no) { int mid=(i+j)/2; e[no].l=i; e[no].r=j; e[no].zhi=0; if(i!=j) { jian(i,mid,2*no); jian(mid+1,j,2*no+1); } } /* void make(int x,int y,int num)//别人的 { e[num].l=x; e[num].r=y; if (x==y) e[num].zhi=r[y]; else { make(x,(x+y)/2,num+num); make((x+y)/2+1,y,num+num+1); e[num].zhi=e[num+num].zhi+e[num+num+1].zhi; } } */ void cha(int i,int zhi,int no) { int mid=(e[no].l+e[no].r)/2; e[no].zhi+=zhi; if(e[no].l==i&&e[no].r==i) return ; if(i<=mid) cha(i,zhi,2*no); else cha(i,zhi,2*no+1); } /* void add(int x,int y,int num)//别人的 { e[num].zhi+=y; if (e[num].l==x && e[num].r==x) return; if (x>(e[num].l+e[num].r)/2) add(x,y,num+num+1); else add(x,y,num+num); } void sub(int x,int y,int num)//别人的 { e[num].zhi-=y; if (e[num].l==x && e[num].r==x) return; if (x>(e[num].l+e[num].r)/2) sub(x,y,num+num+1); else sub(x,y,num+num); } */ int he(int i,int j,int no) { int mid=(e[no].l+e[no].r)/2; if(i==e[no].l&&j==e[no].r) return e[no].zhi; if(j<=mid) return he(i,j,2*no); else if(i>mid) return he(i,j,2*no+1); else return he(i,mid,2*no)+he(mid+1,j,2*no+1); } /* void que(int x,int y,int num)//别人的 { if (x<=e[num].l && y>=e[num].r) SUM+=e[num].zhi; else { if (x>(e[num].l+e[num].r)/2) que(x,y,num+num+1); else if (y<=(e[num].l+e[num].r)/2) que(x,y,num+num); else { que(x,y,num+num); que(x,y,num+num+1); } } }*/ int main() { int t,n,i,a,b; scanf("%d",&t); while(t--) { scanf("%d",&n); jian(1,n,1); for(i=1;i<=n;i++) { scanf("%d",&a); cha(i,a,1); } printf("Case %d:\n",num++); char c; /*c=getchar();//这个有没有无所谓*/ while(scanf("%s",s)) { if(strcmp(s,"End")==0) break; else if(strcmp(s,"Add")==0) { scanf("%d%d",&a,&b); cha(a,b,1); /*c=getchar();//有这个就错了*/ } else if(strcmp(s,"Sub")==0) { scanf("%d%d",&a,&b); cha(a,-b,1); /*c=getchar();//有这个就错了*/ } else { scanf("%d%d",&a,&b); printf("%d\n",he(a,b,1)); /*c=getchar();//有这个就错了*/ } } /* while (scanf(" %s",s)!=EOF)//别人的 { if (strcmp(s,"End")==0) break; scanf("%d %d",&a,&b); if (strcmp(s,"Query")==0) { SUM=0; printf ("%d\n",he(a,b,1)); } else if (strcmp(s,"Add")==0) cha(a,b,1); else cha(a,-b,1); } */ } return 0; }