Practice: HDU is more strict. Just add while
#include<cstdio>#include<cstring>#include<stack>#define left l,m,x<<1#define right m+1,r,x<<1|1const int LMT=50005;using namespace std;int lsum[LMT<<2],rsum[LMT<<2],cov[LMT<<2],n;bool vis[LMT];stack<int>q;void cut(int x,int len){if(cov[x]!=-1){cov[x<<1]=cov[x<<1|1]=cov[x];lsum[x<<1]=rsum[x<<1]=(len-(len>>1))*cov[x];lsum[x<<1|1]=rsum[x<<1|1]=cov[x]*(len>>1);cov[x]=-1;}}void pushup(int x,int len){lsum[x]=lsum[x<<1];rsum[x]=rsum[x<<1|1];if(lsum[x]==len-(len>>1))lsum[x]+=lsum[x<<1|1];if(rsum[x]==len>>1)rsum[x]+=rsum[x<<1];//if(lsum[x]==rsum[x]&&lsum[x]==0)cov[x]=0;//if(lsum[x]==rsum[x]&&lsum[x]==len)cov[x]=1;}int query(int &tag,int pos,int l,int r,int x){if(cov[x]!=-1){tag=cov[x];return (r-l+1)*cov[x];}cut(x,r-l+1);int m=(l+r)>>1,mytag,res=0,len=r-l+1;if(pos<=m){res+=query(mytag,pos,left);switch(mytag){case 0:tag=0;break;case 1:res+=lsum[x<<1|1];if(lsum[x<<1|1]==len>>1)tag=1;else tag=2;break;case 2:tag=2;break;case 3:res+=lsum[x<<1|1];if(lsum[x<<1|1]==len>>1)tag=3;else tag=4;break;case 4:tag=4;break;}}if(pos>m){res+=query(mytag,pos,right);switch(mytag){case 0:tag=0;break;case 1:res+=rsum[x<<1];if(rsum[x<<1]==len-(len>>1))tag=1;else tag=3;break;case 2:res+=rsum[x<<1];if(rsum[x<<1]==len-(len>>1))tag=2;else tag=4;break;case 3:tag=3;break;case 4:tag=4;break;}}return res;}void update(int op,int pos,int l,int r,int x){if(l==r){cov[x]=op;lsum[x]=rsum[x]=op;return;}cut(x,r-l+1);int m=(l+r)>>1;if(pos<=m)update(op,pos,left);if(pos>m)update(op,pos,right);pushup(x,r-l+1);}void init(){int i;memset(cov,0,sizeof(cov));for(i=0;i<n;i++)update(1,i,0,n-1,1);memset(vis,1,sizeof(vis));while(!q.empty())q.pop();}int main(void){char op;int pos,pre,tag,m;scanf("%d%d",&n,&m);init();while(m--){op=getchar();while(op!='D'&&op!='R'&&op!='Q')op=getchar();if(op=='D'){scanf("%d",&pre);pre--;vis[pre]=0;q.push(pre);update(0,pre,0,n-1,1);}if(op=='R'){while(!q.empty()&&vis[q.top()])q.pop();if(!q.empty()){ vis[q.top()]=1; update(1,q.top(),0,n-1,1); q.pop();}}if(op=='Q'){scanf("%d",&pos);pos--;printf("%d\n",query(tag,pos,0,n-1,1));}}return 0;}