30pts 求调
查看原帖
30pts 求调
1020916
mcmahaoran楼主2025/2/5 16:29

rt,提交记录 link,Code:

#include<iostream>
#include<queue>
#define INF 0x3f3f3f3f
#define ls s[0]
#define rs s[1]
#define tmp(a) t[t[a].fa].rs==a
#define tmp_ t[u].v<v
#define _tmp v<t[u].v
using namespace std;

namespace OIfast{
	
	inline int read(){
		register int n=0,f=1;
		register char c=getchar();
		while(c<'0'||c>'9'){
			if(c=='-')f=-1;
			c=getchar();
		}
		while(c>='0'&&c<='9'){
			n=(n<<1)+(n<<3)+(c^48);
			c=getchar();
		}
		return n*f;
	}
	
	inline void print(register int n){
		if(n<0)n=~n+1,putchar('-');
		if(n>=10)print(n/10);
		putchar(n%10^48);
		return ;
	}
	
	inline void write(register int n,register char c){
		print(n),putchar(c);
		return ;
	}
	
}using namespace OIfast;

namespace splayTree{
	
	const int N=1e6+5;
	
	int root=0,tot=0;
	
	struct node{
		int fa,v,cnt,size;
		int s[2];
	}t[N];
	
	inline void init(int x,int _v,int _fa){
		t[x].cnt=t[x].size=1;
		t[x].v=_v,t[x].fa=_fa;
		return ;
	}
	
	inline void pushup(int x){
		t[x].size=t[t[x].ls].size+t[t[x].rs].size+t[x].cnt;
		return ;
	}
	
	inline void rotate(int x){
		int y=t[x].fa;
		int z=t[y].fa;
		int k=tmp(x);
		t[z].s[tmp(y)]=x,t[x].fa=z;
		t[y].s[k]=t[x].s[k^1],t[t[x].s[k^1]].fa=y;
		t[x].s[k^1]=y,t[y].fa=x;
		pushup(y),pushup(x);
		return ;
	}
	
	inline void splay(int x,int k){
		while(t[x].fa!=k){
			int y=t[x].fa;
			int z=t[y].fa;
			if(z!=k)rotate(((tmp(x))^(tmp(y)))?x:y);
			rotate(x);
		}
		if(k==0)root=x;
		return ;
	}
	
	inline void prepare(int v){
		int u=root;
		if(u==0)return ;
		while(t[u].s[tmp_]!=0&&t[u].v!=v)u=t[u].s[tmp_];
		splay(u,0);
		return ;
	}
	
	inline void add(int v){
		int u=root,f=0;
		while(u!=0&&t[u].v!=v){
			f=u;
			u=t[u].s[tmp_];
		}
		if(u){
			++t[u].cnt;
		}else{
			u=++tot;
			init(u,v,f);
			if(f!=0){
				t[f].s[t[f].v<v]=u;
			}
		}
		splay(u,0);
		return ;
	}
	
	inline int get(int v,int f){
		int u=root;
		prepare(v);
		if(_tmp&&f)return u;
		if(tmp_&&(!f))return u;
		if(t[u].s[f]!=0){
			u=t[u].s[f];
			while(t[u].s[f^1]!=0){
				u=t[u].s[f^1];
			}
		}
		return u;
	}
	
	inline void del(int v){
		int a=get(v,0),b=get(v,1);
		splay(a,0),splay(b,a);
		if(t[t[b].ls].cnt>1){
			--t[t[b].ls].cnt;
			splay(t[b].ls,0);
		}else{
			t[b].ls=0;
		}
		return ;
	}
	
	inline int rk(int v){
		prepare(v);
		return t[t[root].ls].size;
	}
	
	inline int kth(int k){
		int u=root;
		if(t[u].size<k)return -1;
		while(1){
			if(k>t[t[u].ls].size+t[u].cnt){
				k-=t[t[u].ls].size+t[u].cnt;
				u=t[u].rs;
			}else{
				if(t[t[u].ls].size>=k)u=t[u].ls;
				else return splay(u,0),t[u].v;
			}
		}
		return 0;
	}
	
}using namespace splayTree;

int n;
queue<int>ans;

inline void work(){
	int opt=read(),x=read();
	if(opt==0)return ;
	else if(opt==1)add(x);
	else if(opt==2)del(x);
	else if(opt==3)add(x),ans.push(rk(x)),del(x);
	else if(opt==4)ans.push(kth(x+1));
	else if(opt==5)add(x),ans.push(t[get(x,0)].v),del(x);
	else if(opt==6)add(x),ans.push(t[get(x,1)].v),del(x);
	return ;
}

signed main(){
	add(INF),add(-INF);
	n=read();
	while(n--)work();
	while(!ans.empty())write(ans.front(),'\n'),ans.pop();
	return 0;
}
2025/2/5 16:29
加载中...