MnZn但不是妹子求助样例RE提交全RE
查看原帖
MnZn但不是妹子求助样例RE提交全RE
529038
Butterfly__qwq楼主2023/10/19 17:23

code:

#include<bits/stdc++.h>
using namespace std;
const int N=500005;
int cnt,x,y,z,rt;
struct FhqTreapNode
{
	int sz,lc,rc,rd,w;
}hq[N];
struct FhqTreap
{
	void update(int u)
	{
		hq[u].sz=hq[hq[u].lc].sz+hq[hq[u].rc].sz+1;
	}
	int nd_init(int w)
	{
		hq[++cnt]={1,0,0,rand(),w};
	}
	void split(int u,int w,int &l,int &r)
	{
		if(u)
		{
			if(hq[u].w<=w)
			{
				l=u;
				split(hq[u].rc,w,hq[u].rc,r);
			}
			else
			{
				r=u;
				split(hq[u].lc,w,l,hq[u].lc);
			}
			update(u);
		}
		else l=r=0;
	}
	int merge(int u,int v)
	{
		if(!u||!v)return u+v;
		if(hq[u].rd<hq[v].rd)
		{
			hq[u].rc=merge(hq[u].rc,v);
			update(u);
			return u;
		}
		else
		{
			hq[v].lc=merge(u,hq[v].lc);
			update(v);
			return v;
		}
	}
	int querk(int u,int rk)
	{
		while(1)
		{
			int p=hq[hq[u].lc].sz+1;
			if(rk==p)return u;
			if(rk<p)u=hq[u].lc;
			if(rk>p)
			{
				rk-=p;
				u=hq[u].rc;
			}
		}
	}
	void ins(int w)
	{
		split(rt,w,x,y);
		rt=merge(merge(x,nd_init(w)),y);
	}
	void del(int w)
	{
		split(rt,w,x,z);
		split(x,w-1,x,y);
		y=merge(hq[y].lc,hq[y].rc);
		rt=merge(merge(x,y),z);
	}
	int rnk(int w)
	{
		split(rt,w-1,x,y);
		rt=merge(x,y);
		return hq[x].sz+1;
	}
	int val(int rk)
	{
		return hq[querk(rt,rk)].w;
	}
	int prv(int w)
	{
		split(rt,w-1,x,y);
		rt=merge(x,y);
		return hq[querk(x,hq[x].sz)].w;
	}
	int nxt(int w)
	{
		split(rt,w,x,y);
		rt=merge(x,y);
		return hq[querk(y,1)].w;
	}
};
int main()
{
	srand(time(0)); 
	FhqTreap t;
	int n,op,x;
	cin>>n;
	while(n--)
	{
		cin>>op>>x;
		if(op==1)t.ins(x);
		if(op==2)t.del(x);
		if(op==3)cout<<t.rnk(x)<<'\n';
		if(op==4)cout<<t.val(x)<<'\n';
		if(op==5)cout<<t.prv(x)<<'\n';
		if(op==6)cout<<t.nxt(x)<<'\n';
	}
}
2023/10/19 17:23
加载中...