哨兵都插入不进去,玄关求条
查看原帖
哨兵都插入不进去,玄关求条
823949
Hhy882577楼主2024/8/2 16:24
#include<bits/stdc++.h>
#define N 500005
#define ll long long
using namespace std;
struct Node{
	int s[2],fa,val,sum=1,siz=1;
}tr[N<<4];
int n,op,k,root,cnt;
inline void pushUp(int x){
	tr[x].siz=tr[tr[x].s[0]].siz+tr[tr[x].s[1]].siz+tr[x].sum;
	return ;
}
inline void rotate(int x){
	int fax=tr[x].fa;
	int k=(tr[fax].s[1]==x);
	tr[fax].s[k]=tr[x].s[k^1];
	tr[tr[x].s[k^1]].fa=fax;
	tr[x].s[k^1]=fax;
	tr[fax].fa=x;
	tr[tr[fax].fa].s[fax==tr[tr[fax].fa].s[1]]=x;
	tr[x].fa=tr[fax].fa;
	pushUp(fax);
	pushUp(x);
	return ;
}
inline void splay(int x,int cnm){
	while(tr[x].fa!=cnm){
		int fax=tr[x].fa;
		if(cnm!=tr[fax].fa){
			if((tr[fax].s[0]==x)||(tr[tr[fax].fa].s[0]==fax))
				rotate(x);
			else
				rotate(fax);		
		}
		rotate(x);
	}
	if(cnm==0)
		root=x;
	return ;
}
inline void find(int val){
	int x=root;
	while(tr[x].s[val>tr[x].val]&&val!=tr[x].val)
		x=tr[x].s[val>tr[x].val];
	splay(x,0);
	return ;
}
int get_pre(int val){
	find(val);
	int x=root;
	if(tr[x].val<val)
		return x;
	x=tr[x].s[0];
	while(tr[x].s[1])
		x=tr[x].s[1];
	return x;
}
int get_suc(int val){
	find(val);
	int x=root;
	if(tr[x].val>val)
		return x;
	x=tr[x].s[1];
	while(tr[x].s[0])
		x=tr[x].s[0];
	return x;
}
inline void delet(int val){
	int pre=get_pre(val);
	int suc=get_suc(val);
	splay(pre,0);
	splay(suc,pre);
	int dele=tr[suc].s[0];
	if(tr[dele].sum>1){
		tr[dele].sum--;
		splay(dele,0);
	}
	else{
		tr[suc].s[0]=0;
		splay(suc,0);
	}
	return ;
}
int get_rank_by_value(int val){
	find(val);
	return tr[tr[root].s[0]].siz;
}
int get_value_by_rank(int num){
	int x=root;
	while(1){
		int chx=tr[x].s[0];
		if(tr[chx].siz+tr[x].sum<num){
			num-=tr[chx].siz+tr[x].sum;
			x=tr[x].s[1];
		}
		else{
			if(tr[chx].siz>=num)
				x=tr[x].s[0];
			else
				break;
		}
		//cout<<x<<" "<<chx<<"\n";
	}
	splay(x,0);
	return tr[x].val;
}
void insert(int val){
	int x=root,hhy=0;
	while(x&&tr[x].val!=val){
		hhy=x;
		x=tr[x].s[val>tr[x].val];
	}
	//cout<<x<<"\n";
	if(x)
		tr[x].sum++;
	else{
		x=++cnt;
		tr[hhy].s[val>tr[hhy].val]=x;
		tr[x].fa=hhy;
		tr[x].val=val;
		tr[x].siz=tr[x].sum=1;
	}
	splay(x,0);
	return ;
}
int main(){
	//ios::sync_with_stdio(0);
	//cin.tie(0);
	//cout.tie(0);
	cin>>n;
	insert(-1e9);
	insert(1e9);
	while(n--){
		cin>>op>>k;
		if(op==1)
			insert(k);
		if(op==2)
			delet(k);
		if(op==3)
			cout<<get_rank_by_value(k)<<"\n";
		if(op==4)
			cout<<get_value_by_rank(k)<<"\n";
		if(op==5)
			cout<<tr[get_pre(k)].val<<"\n";
		if(op==6)
			cout<<tr[get_suc(k)].val<<"\n";
	}
	return 0;
}
2024/8/2 16:24
加载中...