#include<cstdio>
#include<algorithm>
#define pii pair<int,int>
#define N 1919810
#define int long long
using namespace std;
int seed;
void _srand(int x){seed=x;}
int _rand(){seed=seed*97%19260817;return seed;}
struct FHQ_Treap{
pii val[N];
int ch[N][2],siz[N],rnd[N],cnt,root;
#define lc ch[x][0]
#define rc ch[x][1]
int update(int x){siz[x]=siz[lc]+siz[rc]+1;return x;}
void split(int p,pii v,int &x,int &y){
if(!p)return void(x=y=0);
if(val[p]<=v)split(ch[x=p][1],v,ch[p][1],y);
else split(ch[y=p][0],v,x,ch[p][0]);
update(p);
}
int merge(int x,int y){
if(!x||!y)return x+y;
if(rnd[x]<rnd[y]){rc=merge(rc,y);return update(x);}
else{ch[y][0]=merge(x,ch[y][0]);return update(y);}
}
int rnk(int x,int k){
while(1){
if(k==siz[lc]+1)return x;
if(k<=siz[lc])x=lc;
else k-=siz[lc]+1,x=rc;
}
}
pii kth(int rt,int k){return val[rnk(rt,k)];}
int newnode(pii v){siz[++cnt]=1,val[cnt]=v,rnd[cnt]=_rand();return cnt;}
void insert(pii v){
int x,y;
split(root,v,x,y);
root=merge(merge(x,newnode(v)),y);
}
void del(pii v){
int x,y,z;
split(root,v,y,z);
split(y,{v.first,v.second-1},y,x);
root=merge(merge(y,merge(lc,rc)),z);
}
bool find(pii v){
int x,y;
split(root,make_pair(v.first,v.second-1),x,y);
pii v1=kth(y,1);
if(v.first==v1.first)return 1;
else return 0;
}
}t;
int n,m,a[N],ans;
signed main(){
_srand(676767);
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
t.insert({i,a[i]});
ans+=a[i];
}
while(m--){
char s[10];
int x,y;
scanf("%s",s);
if(s[0]=='Q')printf("%lld\n",ans);
else if(s[0]=='C'){
scanf("%lld%lld",&x,&y);
t.del({x,a[x]});
t.insert({x,a[x]-y});
a[x]-=y;
ans-=y;
}else if(s[0]=='I'){
scanf("%lld%lld",&x,&y);
if(t.find({x,-1e9})){
t.del({x,a[x]});
ans-=a[x],ans+=y,a[x]=y;
t.insert({x,a[x]});
}else ans+=y,a[x]=y,t.insert({x,a[x]});
}else if(s[0]=='D'){
scanf("%lld",&x);
pii ax=t.kth(t.root,x);
ans-=ax.second;a[ax.first]=0;
t.del(ax);
}
}
return 0;
}