#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<ctime>
#include<cstdlib>
#define ll long long
#define INF_INT 0x3f3f3f3f
char Ch;
int ff;
inline void rd(int &x){
x=0,ff=1,Ch=getchar();
while((Ch<'0'||Ch>'9')&&Ch!='-')Ch=getchar();
if(Ch=='-')Ch=getchar(),ff=-1;
while(Ch>='0'&&Ch<='9'){
x=(x<<1)+(x<<3)+Ch-'0';
Ch=getchar();
}
x*=ff;
}
inline int random(int x){
return (long long)rand()*rand()%x;
}
using namespace std;
const int N=1e5+5;
char op;
int n,Q,cnt,Top;
bool t[N];
int s[N];
struct Fhq_Treap{
int rt,rl,rr,tp;
int sz[N],pro[N],val[N];
int ch[N][2];
int new_node(int x){
sz[++cnt]=1;
pro[cnt]=rand();
val[cnt]=x;
return cnt;
}
void push_up(int x){
sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;
}
void split(int x,int k,int &ls,int &rs){
if(!x){
ls=rs=0;
return ;
}
if(val[x]<=k){
ls=x;
split(ch[ls][1],k,ch[ls][1],rs);
}
else{
rs=x;
split(ch[rs][0],k,ls,ch[rs][0]);
}
push_up(x);
}
int merge(int ls,int rs){
if(!ls||!rs)return ls+rs;
if(pro[ls]<=pro[rs]){
ch[ls][1]=merge(ch[ls][1],rs);
push_up(ls);
return ls;
}
else{
ch[rs][0]=merge(ls,ch[rs][0]);
push_up(rs);
return rs;
}
}
void dfs(int x){
if(!x)return ;
dfs(ch[x][0]);
printf("%d ",val[x]);
dfs(ch[x][1]);
}
void print(){
puts("Treap:");
dfs(rt);
puts("");
}
void ins(int x){
split(rt,x-1,rl,rr);
rt=merge(rl,merge(new_node(x),rr));
}
int kth(int root,int k){
int x=root,u;
while(1){
u=sz[ch[x][0]]+1;
if(k==u)return val[x];
if(k<u)x=ch[x][0];
else k-=u,x=ch[x][1];
}
}
int ask(int x){
split(rt,x,rl,rr);
int s1=kth(rl,sz[rl]),s2=kth(rr,1),ans=0;
ans=s2-s1-1;
rt=merge(rl,rr);
return ans;
}
void del(int x){
split(rt,x,rl,rr);
split(rl,x-1,rl,tp);
tp=merge(ch[tp][0],ch[tp][1]);
rt=merge(merge(rl,tp),rr);
}
}tr;
int main(){
scanf("%d %d",&n,&Q);
tr.ins(0),tr.ins(n+1);
for(int x;Q--;){
scanf("\n%c",&op);
if(op=='D'){
scanf("%d",&x),s[++Top]=x;
if(!t[x])
tr.ins(x),t[x]=1;
}
if(op=='R'){
tr.del(s[Top--]),t[x]=0;
}
if(op=='Q')
scanf("%d",&x),t[x]?puts("0"):printf("%d\n",tr.ask(x));
}
return 0;
}