FHQ Treap 30pts马蜂良好玄关求调
查看原帖
FHQ Treap 30pts马蜂良好玄关求调
225581
chala_tea楼主2024/10/11 07:15
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define MAXN 100010
const int modp=998244353;

//var

struct node{
	int key,pri,lson,rson,siz;
}t[MAXN];

int q,cnt=0,root=0;

//tool func

inline void update(int x){
	t[x].siz=t[t[x].lson].siz+t[t[x].rson].siz+1;
}

void new_node(int v){
	cnt++;
	t[cnt].siz=1;
	t[cnt].key=v;
	t[cnt].pri=rand();
	t[cnt].lson=t[cnt].rson=0;
}

void split(int x,int k,int &l,int &r){
	if(!x){
		l=0,r=0;
		return;
	}
	
	if(t[x].key<=k){
		l=x,split(t[x].rson,k,t[x].rson,r);
	}else{
		r=x,split(t[x].lson,k,l,t[x].lson);
	}
	update(x);
	return ;
}

int merge(int l,int r){
	
	if(!l||!r) return l+r;
	
	if(t[l].pri<t[r].pri){
		t[l].rson=merge(t[l].rson,r);
		update(l);
		return l;
	}else{
		t[r].lson=merge(l,t[r].lson);
		update(r);
		return r;
	}
	
}

//func

void insert(int a){
	int l=0,r=0;
	split(root,a,l,r);
	new_node(a);
	root=merge(merge(l,cnt),r);
}

void erase(int a){
	int l=0,r=0,p=0;
	split(root,a,l,r);
	split(root,a-1,l,p);
	p=merge(t[p].lson,t[p].rson);
	root=merge(merge(l,p),r);
}

int search_rank(int a){
	int l=0,r=0,res=0;
	split(root,a-1,l,r);
	res=t[l].siz+1;
	root=merge(l,r);
	return res;
}

int search_kth(int x,int a){
	if(t[t[x].lson].siz==a-1) return t[x].key;
	else if(t[t[x].lson].siz<a-1) return search_kth(t[x].rson,a-t[t[x].lson].siz-1);
	else return search_kth(t[x].lson,a);
}

int prenum(int a){
	int l=0,r=0,res=0;
	split(root,a-1,l,r);
	res=search_kth(t[l].siz,l);
	root=merge(l,r);
	return res;
}

int nxtnum(int a){
	int l=0,r=0,res=0;
	split(root,a,l,r);
	res=search_kth(1,r);
	root=merge(l,r);
	return res;
}


signed main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	
	srand((unsigned)time(NULL));
	
	cin>>q;
	
	while(q--){
		int op,x;
		cin>>op>>x;
		if(op==1){
			insert(x);
		}else if(op==2){
			erase(x);
		}else if(op==3){
			cout<<search_rank(x)<<endl;
		}else if(op==4){
			cout<<search_kth(root,x)<<endl;
		}else if(op==5){
			cout<<prenum(x)<<endl;
		}else{
			cout<<nxtnum(x)<<endl;
		}
	}
	
	
	return 0;
}

2024/10/11 07:15
加载中...