Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2273 Accepted Submission(s): 837
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #include <stack> #define N 50000 #define lson l,m,k<<1 #define rson m+1,r,k<<1|1 using namespace std; struct node { int lm,rm,m; int len; }; node st[N<<2]; void up(int &k) { int ls=k<<1,rs=k<<1|1; st[k].lm=st[ls].lm==st[ls].len?st[ls].len+st[rs].lm:st[ls].lm; st[k].rm=st[rs].rm==st[rs].len?st[rs].len+st[ls].rm:st[rs].rm; st[k].m=max(max(st[ls].m,st[rs].m),st[ls].rm+st[rs].lm); //st[k].m=max(max(st[k].lm,st[k].rm),st[k].m); } void build(int l,int r,int k) { st[k].len=r-l+1; if(l==r) { st[k].lm=st[k].rm=st[k].m=1; return ; } int m=(l+r)>>1; build(lson); build(rson); up(k); } int flag; void update(int &index,int l,int r,int k) { if(l==r) { st[k].lm=st[k].rm=st[k].m=flag; return; } int m=(l+r)>>1; if(index<=m) update(index,lson); else update(index,rson); up(k); } int query(int &index,int l,int r,int k) { if(st[k].m==0) return 0; if(st[k].m==st[k].len) return st[k].len; int m=(l+r)>>1; if(st[k].lm&&st[k].lm+l-1>=index) return st[k].lm; if(st[k].rm&&r-st[k].rm+1<=index) return st[k].rm; // printf("%d %d %d\n",l,r,m-st[k<<1].rm+1); if(st[k<<1].rm&&index<=m&&m-st[k<<1].rm+1<=index) return st[k<<1].rm+st[k<<1|1].lm; if(st[k<<1|1].lm&&index>m&&m+st[k<<1|1].lm>=index) return st[k<<1].rm+st[k<<1|1].lm; if(index<=m) return query(index,lson); else return query(index,rson); } int main() { int n,m; char op; int data; while(scanf("%d%d",&n,&m)!=EOF) { stack<int> s; build(1,n,1); while(m--) { getchar(); scanf("%c",&op); switch(op) { case 'Q':scanf("%d",&data); printf("%d\n",query(data,1,n,1));break; case 'D':scanf("%d",&data);s.push(data); flag=0;update(data,1,n,1);break; case 'R':data=s.top();s.pop(); flag=1;update(data,1,n,1);break; } } } return 0; }