FHQ Treap 16 pts 求调(马蜂自认为优良
查看原帖
FHQ Treap 16 pts 求调(马蜂自认为优良
688783
SilverLi楼主2023/5/10 22:11
#include <bits/stdc++.h>
using namespace std;
#define pi pair<int,int>
#define mk make_pair
#define lt first
#define rt second
const int N=1e5+5;
int pos,root;
struct FHQ {
	int l,r,v,pr,si;
	FHQ() {si=1,pr=rand();}
}t[N];
inline void updata(int u) {t[u].si=t[t[u].l].si+t[t[u].r].si+1;}
pi split(int u,int key) {
	if(u==0)    return mk(0,0);
	if(t[u].v<key) {
		pi res=split(t[u].r,key);
		t[u].r=res.lt;
		updata(u);
		return mk(u,res.rt);
	}
	if(t[u].v>=key) {
		pi res=split(t[u].l,key);
		t[u].l=res.rt;
		updata(u);
		return mk(res.lt,u);
	}
}
int merge(int u,int v) {
	if(u==0||v==0)  return u+v;
	if(t[u].pr>=t[v].pr) {
		t[u].r=merge(t[u].r,v);
		updata(u);
		return u;
	}
	if(t[u].pr<t[v].pr) {
		t[v].l=merge(u,t[v].l);
		updata(v);
		return v;
	}
}
inline void ins(int val) {
	t[++pos].v=val;
	pi res=split(root,val);
	int f=merge(res.lt,pos);
	root=merge(f,res.rt);
}
inline void del(int val) {
	pi res=split(root,val);
	pi r2=split(res.rt,val+1);
	int f=merge(t[r2.lt].l,t[r2.lt].r);
	int fx=merge(res.lt,f);
	root=merge(fx,r2.rt);
}
inline int Rank(int val) {
	pi res=split(root,val);
	root=merge(res.lt,res.rt);
	int Rank=t[res.lt].si+1;
	return Rank;
}
#define lx t[now].l
#define rx t[now].r
inline int revRank(int rank) {
	int now=root;
	while(now) {
		if(t[lx].si+1==rank)	break;
		if(t[lx].si+1>=rank)	now=lx;
		else	rank-=t[lx].si+1,now=rx;
	}
	return t[now].v;
}
inline int pre(int x) {
	pi res=split(root,x);
	int now=res.lt;
	while(rx)	now=rx;
	int Pre=t[now].v;
	root=merge(res.lt,res.rt);
	return Pre;
}
inline int nxt(int x) {
	pi res=split(root,x);
	int now=res.rt;
	while(lx)	now=lx;
	int Nxt=t[now].v;
	root=merge(res.lt,res.rt);
	return Nxt;
}
signed main() {
	t[0].si=0;
	int Q;
	cin>>Q;
	while(Q--) {
		int opt,x;
		cin>>opt>>x;
		if(opt==1) {
			ins(x);
		} else if(opt==2) {
			del(x);
		} else if(opt==3) {
			cout<<Rank(x)<<endl;
		} else if(opt==4) {
			cout<<revRank(x)<<endl;
		} else if(opt==5) {
			cout<<pre(x)<<endl;
		} else if(opt==6) {
			cout<<nxt(x)<<endl;
		}
	}
	return 0;
}
2023/5/10 22:11
加载中...