FHQ TLE蒟蒻求调玄关
查看原帖
FHQ TLE蒟蒻求调玄关
929151
xxr___楼主2024/12/30 21:13
#include<bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=(l);i<=(r);++i)
#define pre(i,l,r) for(int i=(l);i>=(r);--i)
const int N=1e5+5;
struct node{
	int vl,sz,ls,rs,pri;
}t[N];
inline void upd(int x){
	t[x].sz=t[t[x].ls].sz+t[t[x].rs].sz+1;
}
inline void split(int u,int x,int &L,int &R){
	if(!u){
		L=R=0;return;
	}
	if(x<t[u].vl){
		R=u;split(t[u].ls,x,L,t[u].ls);
	}else{
		L=u;split(t[u].rs,x,t[u].rs,R);
	}
	upd(u);
}
inline int merge(int u,int v){
	if(!u||!v) return u+v;
	if(t[u].pri<t[v].pri){
		t[u].rs=merge(t[u].rs,v);
		upd(u);
		return u;
	}else{
		t[v].ls=merge(t[v].ls,u);
		upd(v);
		return v;
	}
}
int rt=0,n,op,x,cnt=0,L,R,p;
inline void add(int x){
	++cnt;t[cnt].vl=x;t[cnt].pri=rand();
	t[cnt].ls=t[cnt].rs=0;t[cnt].sz=1;
	split(rt,x,L,R);
	rt=merge(merge(L,cnt),R);
}
inline void del(int x){
	split(rt,x,L,R);split(L,x-1,L,p);
	p=merge(t[p].ls,t[p].rs);
	rt=merge(merge(L,p),R);
}
inline void rk_(int x){
	split(rt,x-1,L,R);
	cout<<t[L].sz+1<<'\n';
	rt=merge(L,R);
}
inline int rank_(int u,int x){
	if(x<=t[t[u].ls].sz){
		return rank_(t[u].ls,x);
	}else if(x==t[t[u].ls].sz+1){
		return u;
	}else{
		return rank_(t[u].rs,x-t[t[u].ls].sz-1);
	}
}
inline void kth(int x){
	cout<<t[rank_(rt,x)].vl<<'\n';
}
inline void pr_(int x){
	split(rt,x-1,L,R);
	cout<<t[rank_(L,t[L].sz)].vl<<'\n';
	rt=merge(L,R);
}
inline void nx_(int x){
	split(rt,x,L,R);
	cout<<t[rank_(R,1)].vl<<'\n';
	rt=merge(L,R);
}
int main(){
	srand(time(NULL));
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin>>n;
	rep(i,1,n){
		cin>>op>>x;
		if(op==1) add(x);
		if(op==2) del(x);
		if(op==3) rk_(x);
		if(op==4) kth(x);
		if(op==5) pr_(x);
		if(op==6) nx_(x);
	}
	return 0;
}
//tomxi
2024/12/30 21:13
加载中...