#include<bits/stdc++.h>
using namespace std;
#define N 100005
#define int long long
int n,m;
int now,rt[N*2],tot;
struct seg{
#define ls lc[x]
#define rs rc[x]
#define mid ((l+r)>>1)
int a[N*20],tag[N*20],lc[N*20],rc[N*20],tot;
void addnode(int &x){
if(x==0)x=++tot;
}
void push_up(int x,int l,int r){
a[x]=a[ls]+a[rs]+tag[x]*(r-l+1);
}
void upd(int o,int L,int R,int &x,int l,int r,int lst){
if(x==0)addnode(x),tag[x]=tag[lst],a[x]=a[lst];
if(L<=l&&r<=R){
ls=lc[lst],rs=rc[lst];
tag[x]+=o;
push_up(x,l,r);
return;
}
if(L<=mid)upd(o,L,R,ls,l,mid,lc[lst]);
if(R>mid)upd(o,L,R,rs,mid+1,r,rc[lst]);
if(L>mid)ls=lc[lst];
if(R<=mid)rs=rc[lst];
push_up(x,l,r);
}
int query(int L,int R,int &x,int l,int r,int stag){
if(L<=l&&r<=R){
return a[x]+stag*(r-l+1);
}
int ret=0;
if(L<=mid)ret+=query(L,R,ls,l,mid,stag+tag[x]);
if(R>mid)ret+=query(L,R,rs,mid+1,r,stag+tag[x]);
return ret;
}
}mp;
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
int o;
cin>>o;
mp.upd(o,i,i,rt[now],1,n,rt[now]);
}
while(m--){
char op;int a,b,c;
cin>>op>>a;
if(op=='B')now=a;
else{
cin>>b;
if(op=='Q'){
cout<<mp.query(a,b,rt[now],1,n,0)<<'\n';
}else{
cin>>c;
if(op=='C'){
rt[now+1]=0;
mp.upd(c,a,b,rt[now+1],1,n,rt[now]);
now++;
}else{
cout<<mp.query(a,b,rt[c],1,n,0)<<'\n';
}
}
}
}
return 0;
}