/* 带点更新(累加),求部分线段和 */ /*(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30) (2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30); (3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数; (4)End 表示结束,这条命令在每组数据最后出现;*/ #include<cstdio> #include<cstring> #define maxn 50010 typedef struct node{ int sum ; int l , r ; }Lnode; Lnode tree[maxn*4] ; int ans ; int num[maxn] ; void bulid(int root , int ll , int rr){ if(ll == rr){ tree[root].l = tree[root].r = ll ; tree[root].sum = num[ll] ; return; } tree[root].l = ll ; tree[root].r = rr ; int mid = (ll+rr)/2 ; bulid(root*2 , ll , mid) ; bulid(root*2+1 , mid+1 , rr) ; tree[root].sum = tree[root*2].sum + tree[root*2+1].sum ; } void update(int root , int pos , int value){ if(tree[root].l == pos&&tree[root].r == pos){ tree[root].sum+=value ; return; } int mid = (tree[root].l+tree[root].r)/2 ; if(pos <= mid) update(root*2 , pos , value) ; else update(root*2+1 , pos , value) ; tree[root].sum = tree[root*2].sum + tree[root*2+1].sum ; } void query(int root , int s , int e){ int mid = (tree[root].l + tree[root].r)/2 ; if(tree[root].l==s&&tree[root].r==e){ ans += tree[root].sum ; } else if(s>mid) query(root*2+1 , s , e) ; else if(e<=mid) query(root*2 , s , e ) ; else if(s<=mid&&mid<=e){ // 此处 if可去掉 query(root*2 , s , mid) ; query(root*2+1 , mid+1 , e) ; } } int main(){ int t , cas=0 ; int n,x,y ; char str[10] ; scanf("%d" , &t) ; while(t--){ scanf("%d" , &n) ; for(int i=1 ; i<=n ; i++) scanf("%d" , &num[i]) ; bulid(1,1,n) ; printf("Case %d: " , ++cas) ; while(~scanf("%s" , str),str[0]!='E'){ scanf("%d%d" , &x , &y) ; if(str[0] == 'Q'){ ans = 0 ; query(1 , x , y ) ; printf("%d " , ans) ; } else if(str[0] == 'A'){ update(1 , x, y) ; } else if(str[0] == 'S'){ update(1 , x, -y) ; } } } return 0 ; }