#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100005;
int num,rt,n,m,opt;
char op;
int s[N],top,v[N];
struct treap{
int val,size,ls,rs,rand;
}tr[N];
void update(int p){tr[p].size=tr[tr[p].ls].size+tr[tr[p].rs].size+1;}
int New(int val){tr[++num]={val,1,0,0,rand()};return num;}
void Split(int p,int val,int &x,int &y)
{
if(!p){x=0;y=0;return;}
if(tr[p].val<=val)
{
x=p;
Split(tr[p].rs,val,tr[p].rs,y);
}
else {
y=p;
Split(tr[p].ls,val,x,tr[p].ls);
}
update(p);
}
int merge(int x,int y)
{
if(!x||!y)return x+y;
if(tr[x].rand<=tr[y].rand)
{
tr[x].rs=merge(tr[x].rs,y);
update(x);return x;
}
else{
tr[y].ls=merge(x,tr[y].ls);
update(y);return y;
}
}
void insert(int val)
{
int x,y;
Split(rt,val-1,x,y);
rt=merge(merge(x,New(val)),y);
}
void de(int val)
{
int x,y,z;
Split(rt,val,x,y);
Split(rt,val-1,x,z);
rt=merge(merge(x,merge(tr[z].ls,tr[z].rs)),y);
}
int Find(int p,int kth)
{
if(kth==tr[tr[p].ls].size+1)return p;
if(kth<=tr[tr[p].ls].size)return Find(tr[p].ls,kth);
else return Find(tr[p].rs,kth-tr[tr[p].ls].size-1);
}
int pre(int val)
{
int x,y,ass;
Split(rt,val-1,x,y);
ass=tr[Find(x,tr[x].size)].val;
rt=merge(x,y);
return ass;
}
int nxt(int val)
{
int x,y,ass;
Split(rt,val,x,y);
ass=tr[Find(y,1)].val;
rt=merge(x,y);
return ass;
}
signed main()
{
srand(time(0));
scanf("%lld%lld",&n,&m);
insert(0),insert(n+1);
for(int i=1;i<=m;i++)
{
cin>>op;
if(op=='D')
{
scanf("%lld",&opt);s[++top]=opt;
v[opt]=1;
insert(opt);
}
if(op=='Q')
{
scanf("%lld",&opt);
if(v[opt]==1)printf("0\n");
else printf("%lld\n",nxt(opt)-pre(opt)-1);
}
if(op=='R')
{
de(s[top]);
v[s[top]]=0;
top--;
}
}
}