/* 带点更新(累加),求部分线段和 */
/*(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:\n" , ++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\n" , ans) ;
}
else if(str[0] == 'A'){
update(1 , x, y) ;
}
else if(str[0] == 'S'){
update(1 , x, -y) ;
}
}
}
return 0 ;
}