#include <iostream> #include <cstdio> #include <cstring> #include <stack> using namespace std; struct p { int lmax; int rmax; int max; int l; int r; }tree[222222]; void construct(int n,int l,int r) { tree[n].l=l; tree[n].r=r; tree[n].max=tree[n].lmax=tree[n].rmax=1+r-l; if(l==r) return ; int mid=(l+r)/2; construct(n*2,l,mid); construct(n*2+1,mid+1,r); } char ch[11]; void change(int n,int x,int k) { int mid=(tree[n].r+tree[n].l)/2; if(tree[n].l==tree[n].r) { if(k==1) tree[n].lmax=tree[n].rmax=tree[n].max=1; else tree[n].lmax=tree[n].rmax=tree[n].max=0; return ; } if(x<=mid) { change(n*2,x,k); } else { change(n*2+1,x,k); } tree[n].lmax=tree[n*2].lmax; tree[n].rmax=tree[n*2+1].rmax; tree[n].max=max(max(tree[2*n].max,tree[n*2+1].max),tree[n*2].rmax+tree[n*2+1].lmax); if(tree[n*2].lmax==tree[n*2].r-tree[n*2].l+1) tree[n].lmax+=tree[n*2+1].lmax; if(tree[n*2+1].rmax==tree[n*2+1].r-tree[n*2+1].l+1) tree[n].rmax+=tree[n*2].rmax; } int query(int n,int x) { int mid=(tree[n].l+tree[n].r)/2; if(tree[n].l==tree[n].r||tree[n].max==0||tree[n].max==tree[n].r-tree[n].l+1) return tree[n].max; if(x<=mid) { if(x>=tree[n*2].r-tree[n*2].rmax+1) return query(n*2,x)+query(n*2+1,mid+1); else return query(n*2,x); } else { if(x<=tree[n*2+1].lmax+tree[n*2+1].l-1) return query(2*n+1,x)+query(n*2,mid); else return query(2*n+1,x); } } const int maxn = 50000+10; int s[maxn],top;//s为模拟栈 int main() { int i,j,k,l,m,n,x; while(cin>>n>>m) { top = 0; construct(1,1,n); while(m--) { scanf("%s",ch); if(ch[0] == 'D') { scanf("%d",&x); s[top++] = x; change(1,x,0) ; } else if(ch[0] == 'Q') { scanf("%d",&x); printf("%d\n",query(1,x)); } else { if(x>0) { x = s[--top]; change(1,x,1); } } } } return 0; }