萌新splay 93pts求调
查看原帖
萌新splay 93pts求调
110009
Soul_Love楼主2023/12/19 22:11
#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
int n,root,idx,op;
inline int read()
{
	int k=0,f=0;char c=getchar();
	for(;!isdigit(c);c=getchar()) f|=c=='-';
	for(;isdigit(c);c=getchar()) k=(k<<1)+(k<<3)+(c^48);
	return f?-k:k;
}
struct node
{
	int s[2],p,v,cnt,size;
}tr[1000100];
inline void push_up(int x)
{
	tr[x].size=tr[tr[x].s[0]].size+tr[tr[x].s[1]].size+tr[x].cnt;
}
inline void rotate(int x)
{
	int y=tr[x].p,z=tr[y].p,k=tr[y].s[1]==x;
	tr[y].s[k]=tr[x].s[k^1];
	tr[tr[x].s[k^1]].p=y;
	tr[x].s[k^1]=y;
	tr[y].p=x;
	tr[z].s[tr[z].s[1]==y]=x;
	tr[x].p=z;
	push_up(y);
	push_up(x);
}
inline void splay(int x,int k)
{
	while(tr[x].p!=k)
	{
		int y=tr[x].p,z=tr[y].p;
		if(z!=k) (tr[y].s[0]==x)^(tr[z].s[0]==y)?rotate(x):rotate(y);
		rotate(x);
	}
	if(k==0) root=x;
}
inline int find(int v)
{
	int x=root;
	while(tr[x].s[v>tr[x].v]&&v!=tr[x].v) x=tr[x].s[v>tr[x].v];
	splay(x,0);
	return x;
}
inline int get_rank(int v)
{
	int x=find(v);
	return tr[tr[x].s[0]].size;
}
inline int get_val(int k)
{
	int x=root;
	while(1)
	{
		int y=tr[x].s[0];
		if(tr[y].size+tr[x].cnt<k)
		{
			k-=tr[y].size+tr[x].cnt;
			x=tr[x].s[1];
		}
		else if(tr[y].size>=k) x=y;
		else break;
	}
	splay(x,0);
	return tr[x].v;
}
inline int get_pre(int v)
{
	int x=find(v);
	if(tr[x].v<v) return x;
	x=tr[x].s[0];
	while(tr[x].s[1]) x=tr[x].s[1];
	return x;
}
inline int get_suc(int v)
{
	int x=find(v);
	if(tr[x].v>v) return x;
	x=tr[x].s[1];
	while(tr[x].s[0]) x=tr[x].s[0];
	return x;
}
inline void del(int v)
{
	int pre=get_pre(v),suc=get_suc(v);
	splay(pre,0);
	splay(suc,pre);
	int del=tr[suc].s[0];
	if(tr[del].cnt>1)
	{
		tr[del].cnt--;
		splay(del,0);
	}
	else
	{
		tr[suc].s[0]=0;
		splay(suc,0);
	}
}
inline void insert(int v)
{
	int x=root,p=0;
	while(x&&tr[x].v!=v)
	{
		p=x;
		x=tr[x].s[v>tr[x].v];
	}
	if(x) tr[x].cnt++;
	else
	{
		x=++idx;
		tr[p].s[v>tr[p].v]=x;
		tr[x].v=v;
		tr[x].p=p;
		tr[x].size=tr[x].cnt=1;
	}
	splay(x,0);
}
signed main()
{
	n=read();
	insert(-inf);
	insert(inf);
	while(n--)
	{
		op=read();
		if(op==1) insert(read());
		else if(op==2) del(read());
		else if(op==3) printf("%lld\n",get_rank(read()));
		else if(op==4) printf("%lld\n",get_val(read()+1));
		else if(op==5) printf("%lld\n",tr[get_pre(read())].v);
		else printf("%lld\n",tr[get_suc(read())].v);
	}
	return 0;
}
2023/12/19 22:11
加载中...