线段树简单题
#include<stdio.h> #define N 50005 int a[N],n,c,cnt; struct op { int left,right,cont; }p[N*3]; void insert(int l,int r,int i) { p[i].left=l;p[i].right=r; if(l==r) { p[i].cont=a[l];return; } int mind=(l+r)/2; insert(l,mind,i*2); insert(mind+1,r,i*2+1); p[i].cont=p[i*2].cont+p[i*2+1].cont; } void xiugai(int l,int r,int i) { if(l==r) { p[i].cont+=cnt; return ; } int mind=(l+r)/2; if(c>mind) { xiugai(mind+1,r,i*2+1); } else { xiugai(l,mind,i*2); } p[i].cont=p[i*2].cont+p[i*2+1].cont; } int chaxun(int start,int end,int i) { int sum=0; if(p[i].left==start&&p[i].right==end) { return p[i].cont; } int mind=(p[i].left+p[i].right)/2; if(start>mind) sum+=chaxun(start,end,i*2+1); else if(end<=mind) sum+=chaxun(start,end,i*2); else { sum+=chaxun(start,mind,i*2); sum+=chaxun(mind+1,end,i*2+1); } return sum; } int main() { int i,j,t,o=1; char str[20]; scanf("%d",&t); while(o<=t) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); insert(1,n,1); printf("Case %d:\n",o); while(scanf("%s",str),str[0]!='E') { scanf("%d%d",&c,&cnt); if(str[0]=='A') { xiugai(1,n,1); } else if(str[0]=='S') { cnt=-cnt; xiugai(1,n,1); } else if(str[0]=='Q') { printf("%d\n",chaxun(c,cnt,1)); } } o++; } return 0; }