#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 50010
struct Node{
int R;
int L;
int W;///储存区间(R,L)的和
}tree[4*N];
int n;
void BuildTree(int root,int l,int r){
tree[root].L=l;
tree[root].R=r;
if(l==r){ ///左右节点相同,则该结点为第i个工兵营地
scanf("%d",&tree[root].W);
return ;
}
///root为父节点,则继续建图
int mid=(l+r)/2;
BuildTree(2*root,l,mid);
BuildTree(2*root+1,mid+1,r);
tree[root].W=tree[2*root].W+tree[2*root+1].W; ///父节点的W值应该是子节点的和
}
int QuerySum(int root,int a,int b){
if(tree[root].L==a&&tree[root].R==b){ ///如果结点的区间与被求区间相同,则直接返回W
return tree[root].W;
}
///结点区间与被求区间不相同,继续求解
int mid=(tree[root].L+tree[root].R)/2;
if(b<=mid)
return QuerySum(2*root,a,b);
else if(a>mid)
return QuerySum(2*root+1,a,b);
else
return QuerySum(2*root,a,mid)+QuerySum(2*root+1,mid+1,b);
}
void UpdateAdd(int root,int a,int b){
if(tree[root].L==tree[root].R&&tree[root].L==a){ ///找到a的根节点
tree[root].W+=b; ///值加b
return ;
}
tree[root].W+=b;///还未找到根节点,但父节点的W依旧要+b
int mid=(tree[root].L+tree[root].R)/2;
if(a<=mid)
UpdateAdd(2*root,a,b);
else
UpdateAdd(2*root+1,a,b);
}
int main(){
int ca=1,T;
scanf("%d",&T);
while(T--){
printf("Case %d:\n",ca++);
scanf("%d",&n);
BuildTree(1,1,n);
char s[10];
while(1){
scanf("%s",s);
int a,b;
if(s[0]=='Q'){
scanf("%d%d",&a,&b);
printf("%d\n",QuerySum(1,a,b));
}
else if(s[0]=='A'){
scanf("%d%d",&a,&b);
UpdateAdd(1,a,b);
}
else if(s[0]=='S'){
scanf("%d%d",&a,&b);
UpdateAdd(1,a,-b);
}
else {
break;
}
}
}
return 0;
}