观察到只有旋转最大最小
这样对树形态几乎没有变化
模拟一下
线段树维护深度即可
#include<bits/stdc++.h>
using namespace std;
#define re register
#define ll long long
#define pb push_back
#define cs const
#define bg begin
#define pii pair<int,int>
#define fi first
#define se second
cs int RLEN=1<<20|1;
inline char gc(){
static char ibuf[RLEN],*ib,*ob;
(ib==ob)&&(ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));
return (ib==ob)?EOF:*ib++;
}
inline char getc(){
char ch=gc();
while(!isalpha(ch))ch=gc();
return ch;
}
inline int read(){
char ch=gc();
int res=0,f=1;
while(!isdigit(ch))f^=ch=='-',ch=gc();
while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=gc();
return f?res:-res;
}
template<class tp>inline void chemx(tp &a,tp b){a<b?a=b:0;}
template<class tp>inline void chemn(tp &a,tp b){a>b?a=b:0;}
cs int N=100005;
struct opt{
int op,x;
}q[N];
int n,m,rt,a[N],cnt;
set<int> st;
set<int>::iterator it;
namespace Seg{
int tag[N<<2];
#define lc (u<<1)
#define rc ((u<<1)|1)
#define mid ((l+r)>>1)
inline void pushnow(int u,int k){
tag[u]+=k;
}
inline void pushdown(int u){
if(!tag[u])return;
pushnow(lc,tag[u]),pushnow(rc,tag[u]);
tag[u]=0;
}
void update(int u,int l,int r,int st,int des,int k){
if(st>des)return;
if(st<=l&&r<=des)return pushnow(u,k);
pushdown(u);
if(st<=mid)update(lc,l,mid,st,des,k);
if(mid<des)update(rc,mid+1,r,st,des,k);
}
void insert(int u,int l,int r,int p,int k){
if(l==r){tag[u]=k;return ;}
pushdown(u);
if(p<=mid)insert(lc,l,mid,p,k);
else insert(rc,mid+1,r,p,k);
}
int query(int u,int l,int r,int p){
if(l==r)return tag[u];
pushdown(u);
if(p<=mid)return query(lc,l,mid,p);
else return query(rc,mid+1,r,p);
}
#undef lc
#undef rc
#undef mid
}
int fa[N],lc[N],rc[N];
inline int insert(int k){
if(!rt){rt=k,st.insert(k),Seg::insert(1,1,n,k,1);return 1;}
it=st.lower_bound(k);
int x=0,dx=0,y=0,dy=0,now;
if(it!=st.end())x=*it,dx=Seg::query(1,1,n,x);
if(it!=st.bg())it--,y=*it,dy=Seg::query(1,1,n,y);
if(dx>dy)fa[k]=x,now=dx+1,lc[x]=k;
else fa[k]=y,now=dy+1,rc[y]=k;
Seg::insert(1,1,n,k,now);
st.insert(k);
return now;
}
inline int spalymin(){
int now=*st.bg(),dep=Seg::query(1,1,n,now);
if(now==rt)return dep;
Seg::update(1,1,n,now+1,fa[now]-1,-1);
Seg::update(1,1,n,1,n,1);
lc[fa[now]]=rc[now],fa[rc[now]]=fa[now];
rc[now]=rt,fa[rt]=now,rt=now;
Seg::insert(1,1,n,now,1);
return dep;
}
inline int deletmin(){
int res=spalymin();
Seg::update(1,1,n,1,n,-1),st.erase(rt),rt=rc[rt],fa[rt]=0;
return res;
}
inline int spalymax(){
int now=*st.rbegin(),dep=Seg::query(1,1,n,now);
if(now==rt)return dep;
Seg::update(1,1,n,fa[now]+1,now-1,-1);
Seg::update(1,1,n,1,n,1);
rc[fa[now]]=lc[now],fa[lc[now]]=fa[now];
lc[now]=rt,fa[rt]=now,rt=now;
Seg::insert(1,1,n,now,1);
return dep;
}
inline int deletmax(){
int res=spalymax();
Seg::update(1,1,n,1,n,-1),st.erase(rt),rt=lc[rt],fa[rt]=0;
return res;
}
int main(){
#ifdef Stargazer
freopen("lx.in","r",stdin);
freopen("my.out","w",stdout);
#endif
m=read();
for(int i=1;i<=m;i++){
int op=read();q[i].op=op;
if(op==1)q[i].x=a[++n]=read();
}
sort(a+1,a+n+1),n=unique(a+1,a+n+1)-a-1;
for(int i=1;i<=m;i++)if(q[i].op==1)q[i].x=lower_bound(a+1,a+n+1,q[i].x)-a;
for(int i=1;i<=m;i++){
// cerr<<q[i].x<<'
';
switch(q[i].op){
case 1:cout<<insert(q[i].x)<<'
';break;
case 2:cout<<spalymin()<<'
';break;
case 3:cout<<spalymax()<<'
';break;
case 4:cout<<deletmin()<<'
';break;
case 5:cout<<deletmax()<<'
';break;
}
}
}