6666

#include <bits/stdc++.h>
using namespace std;
const int N=100005,inf=0x7fffffff;
struct node{
	int l,r,val,dat,cnt,size;
}a[N];
int tot,root,n;
int New(int val)
{
	a[++tot].val=val;
	a[tot].dat=rand();
	a[tot].cnt=a[tot].size=1;
	return tot; 
}
void update(int p)
{
	a[p].size=a[a[p].l].size+a[a[p].r].size+a[p].cnt;
}
void build()
{
	New(-inf);
	New(inf);
	root=1;
	a[1].r=2;
	update(root);
}
int Rank(int p,int val)
{
	if(p==0)
		return 0;
	if(val==a[p].val)
		return a[a[p].l].size+1;
	if(val<a[p].val)
		return Rank(a[p].l,val);
	return Rank(a[p].r,val)+a[a[p].l].size+a[p].cnt;
}
int Val(int p,int rank)
{
	if(p==0)
		return inf;
	if(a[a[p].l].size>=rank)
		return Val(a[p].l,rank);
	if(a[a[p].l].size+a[p].cnt>=rank)
		return a[p].val;
	return Val(a[p].r,rank-a[a[p].l].size-a[p].cnt);
}
void zig(int &p)
{
	int q=a[p].l;
	a[p].l=a[q].r;
	a[q].r=p;
	p=q;
	update(a[p].r);
	update(p);
}
void zag(int &p)
{
	int q=a[p].r;
	a[p].r=a[q].l;
	a[q].l=p;
	p=q;
	update(a[p].l);
	update(p);
}
void insert(int &p,int val)
{
	if(p==0)
	{
		p=New(val);
		return;
	}
	if(val==a[p].val)
	{
		a[p].cnt++;
		update(p);
		return;
	}
	if(val<a[p].val)
	{
		insert(a[p].l,val);
		if(a[p].dat<a[a[p].l].dat)
			zig(p);
	}
	else
	{
		insert(a[p].r,val);
		if(a[p].dat<a[a[p].r].dat)
			zag(p);
	}
	update(p);
}
int pre(int val)
{
	int ans=1;
	int p=root;
	while(p)
	{
		if(val==a[p].val)
		{
			if(a[p].l>0)
			{
				p=a[p].l;
				while(a[p].r>0)
					p=a[p].r;
				ans=p;
			}
			break;
		}
		if(a[p].val<val && a[p].val>a[ans].val)
			ans=p;
		p=val<a[p].val?a[p].l:a[p].r;
	}
	return a[ans].val;
}
int Next(int val)
{
	int ans=2;
	int p=root;
	while(p)
	{
		if(val==a[p].val)
		{
			if(a[p].r>0)
			{
				p=a[p].r;
				while(a[p].l>0)
					p=a[p].l;
				ans=p;
			}
			break;
		}
		if(a[p].val>val && a[p].val<a[ans].val)
			ans=p;
		p=val<a[p].val?a[p].l:a[p].r;
	}
	return a[ans].val;
}
void remove(int &p,int val)
{
	if(p==0)
		return;
	if(val==a[p].val)
	{
		if(a[p].cnt>1)
		{
			a[p].cnt--;
			update(p);
			return;
		}
		if(a[p].l || a[p].r)
		{
			if(a[p].r==0 || a[a[p].l].dat>a[a[p].r].dat)
			{
				zig(p);
				remove(a[p].r,val);
			}
			else
			{
				zag(p);
				remove(a[p].l,val);
			}
			update(p);
		}
		else
			p=0;
		return;
	} 
	val<a[p].val?remove(a[p].l,val):remove(a[p].r,val);
	update(p);
}
int main()
{
	build();
	cin>>n;
	while(n--)
	{
		int op,x;
		cin>>op>>x;
		switch(op)
		{
			case 1:
				insert(root,x);
				break;
			case 2:
				remove(root,x);
				break;
			case 3:
				cout<<Rank(root,x)-1<<endl;
				break;
			case 4:
				cout<<Val(root,x+1)<<endl;
				break;
			case 5:
				cout<<pre(x)<<endl;
				break;
			case 6:
				cout<<Next(x)<<endl;
				break;
		}
	}
	return 0;
}/*
4
1 10
1 30
1 20
3 21
*/

  

posted @ 2025-07-04 14:25  wyh0721  阅读(7)  评论(0)    收藏  举报