#include<bits/stdc++.h>
using namespace std;
const int M=5e4+7;
struct tr
{
int l,r,pre,end,maxx;
}t[M<<2];
void up(int p)
{
t[p].pre=t[p<<1].pre==t[p<<1].r-t[p<<1].l+1?t[p<<1].pre+t[p<<1|1].pre:t[p<<1].pre;
t[p].end=t[p<<1|1].end==t[p<<1|1].r-t[p<<1|1].l+1?t[p<<1|1].end+t[p<<1].end:t[p<<1|1].end;
t[p].maxx=max(t[p<<1].maxx,max(t[p<<1].end+t[p<<1|1].pre,t[p<<1|1].maxx));
}
void buildtree(int l,int r,int p)
{
t[p].l=l;
t[p].r=r;
if(l==r)
{
t[p].pre=t[p].end=t[p].maxx=1;
return;
}
int mid=(l+r)>>1;
buildtree(l,mid,p<<1);
buildtree(mid+1,r,p<<1|1);
up(p);
}
void change(int l,int r,int v,int p)
{
if(l<=t[p].l&&t[p].r<=r)
{
t[p].pre=t[p].maxx=t[p].end=v;
return;
}
int mid=(t[p].l+t[p].r)>>1;
if(l<=mid)
{
change(l,r,v,p<<1);
}
if(r>mid)
{
change(l,r,v,p<<1|1);
}
up(p);
}
int query(int k,int p)
{
if(t[p].l==t[p].r)
{
return t[p].pre;
}
int mid=(t[p].r+t[p].l)>>1;
if(k<=mid)
{
if(mid-t[p<<1].end<k)
{
return t[p<<1].end+t[p<<1|1].pre;
}
else
return query(k,p<<1);
}
if(k>mid)
{
if(mid+t[p<<1|1].pre>=k)
{
return t[p<<1].end+t[p<<1|1].pre;
}
else
return query(k,p<<1|1);
}
return 1;
}
int st[M],n,m,tot;
int main()
{
cin>>n>>m;
buildtree(1,n,1);
m=m*2;
for(int i=1;i<=m;i++)
{
char o;
int k;
scanf("%c",&o);
if(o=='D')
{
scanf("%d",&k);
change(k,k,0,1);
st[++tot]=k;
}
if(o=='R')
{
change(st[tot],st[tot],1,1);
tot--;
}
if(o=='Q')
{
scanf("%d",&k);
cout<<query(k,1)<<endl;
}
}
}