http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66989#problem/I
#include <cstdio>
#include <algorithm>
#define SI(T)int T;scanf("%d",&T)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int SIZE=5e4+10;
const int maxn=500000;
int st[SIZE];
struct node{
int sum_l,sum_r,sum;//sum_l从节点左边开始的连续多少个,sum_r一样,sum是节点最大的连续个数,其实可以不必sum,下面的关系挺清楚的
}a[SIZE<<2];
void pushup(int l,int r,int rt){
a[rt].sum_l=a[rt<<1].sum_l;
a[rt].sum_r=a[rt<<1|1].sum_r;
a[rt].sum=max(max(a[rt<<1].sum,a[rt<<1|1].sum),a[rt<<1].sum_r+a[rt<<1|1].sum_l);
int m=r-l+1;
if(a[rt].sum_l==m-(m>>1))a[rt].sum_l+=a[rt<<1|1].sum_l;
if(a[rt].sum_r==m>>1)a[rt].sum_r+=a[rt<<1].sum_r;
}
void build(int l,int r,int rt){
a[rt].sum=a[rt].sum_l=a[rt].sum_r=r-l+1;
if(l==r)return;
int m=(l+r)>>1;
build(lson);
build(rson);
}
void update(int p,int c,int l,int r,int rt){
if(l==r){
a[rt].sum=a[rt].sum_l=a[rt].sum_r=c;
return;
}
int m=(l+r)>>1;
if(p<=m)update(p,c,lson);
if(p>m)update(p,c,rson);
pushup(l,r,rt);
}
int query(int p,int l,int r,int rt){
if(l==r||a[rt].sum==0||a[rt].sum==r-l+1)return a[rt].sum;
int m=(l+r)>>1;
if(p<=m){
if(m-a[rt<<1].sum_r+1<=p)return query(p,lson)+query(m+1,rson);
return query(p,lson);
}
else{
if(m+a[rt<<1|1].sum_l>=p)return query(p,rson)+query(m,lson);
return query(p,rson);
}
}
int main()
{
int n,m,x;
// freopen("F://in.txt","r",stdin);
char s[10];
while(scanf("%d%d",&n,&m)!=EOF){
int t=0;
build(1,n,1);
while(m--){
scanf("%s",s);
if(s[0]=='D'){
scanf("%d",&x);
update(x,0,1,n,1);
st[t++]=x;
}
else if(s[0]=='Q'){
scanf("%d",&x);
printf("%d\n",query(x,1,n,1));
}
else {
x=st[--t];
update(x,1,1,n,1);
}
}
}
return 0;
}