解题思路
平衡树,支持插入,删除,找前驱后继,set水过。
#include<iostream> #include<cstdio> #include<cstring> #include<set> using namespace std; const int MAXN = 50005; inline int rd(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();} while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?x:-x; } int n,m,stk[MAXN],top; set<int> S; set<int>::iterator it,it1; int main(){ n=rd(),m=rd();char c;int x; S.insert(0),S.insert(n+1); while(m--){ c=getchar(); while(c<'A' || c>'Z') c=getchar(); if(c=='R') {S.erase(stk[top]);top--;continue;} x=rd(); if(c=='D') S.insert(x),stk[++top]=x; else{ if(S.find(x)!=S.end()) {puts("0");continue;} it=S.lower_bound(x);it1=it;it1--; printf("%d ",(*it)-(*it1)-1); } } return 0; }