FHQ 65pts
查看原帖
FHQ 65pts
788951
TLE_AK楼主2024/7/11 10:23
#include<bits/stdc++.h>
using namespace std;

namespace acac
{
	struct node
	{
		int ls,rs,sz,num,v,tag,cnt;
		bool zl[30];//贫穷用 
		char ch;
	}tree[100010];
	
	int cnt,rt,out;
	void new_node(int &va,int w,char ch)
	{
		tree[++cnt].sz=1;
		va=cnt;
		tree[va].cnt=1;
		tree[cnt].v=w;
	//	tree[cnt].ch=ch;
	//	tree[cnt].zl[ch-'a']=1;
		tree[cnt].num=rand();
	}
	
	void pu(int u)
	{
		tree[u].sz=tree[tree[u].ls].sz+tree[tree[u].rs].sz+tree[u].cnt;
//		for(int i=1;i<=26;i++)
//		{
//			tree[u].zl[i]=tree[tree[u].ls].zl[i]|tree[tree[u].rs].zl[i];
//		}
	}
	
	void pd(int u)
	{
		if(tree[u].tag)
		{
			tree[tree[u].ls].tag^=1;
			tree[tree[u].rs].tag^=1;
			swap(tree[tree[u].ls].ls,tree[tree[u].ls].rs);
			swap(tree[tree[u].ls].ls,tree[tree[u].ls].rs);
			tree[u].tag=0;
		}
	}
	
	void print(int u)
	{
		if(!u)return ;
		print(tree[u].ls);
		cout<<u<<' '<<tree[u].sz<<' '<<tree[u].ls<<' '<<tree[u].rs<<endl;
		print(tree[u].rs);
	}
	
	void sp(int u,int &l,int &r,int sum)
	{
		if(!u)
		{
			l=r=0;
			return ;
		}
	//	pd(u);
	//	cout<<tree[u].v<<endl;
		if(tree[u].v<=sum)
		{
			l=u;
			sp(tree[u].rs,tree[u].rs,r,sum);
		}
		else 
		{
			r=u;
			sp(tree[u].ls,l,tree[u].ls,sum);
		}
		pu(u);
		return ;
	}
	
	void me(int &u,int l,int r)
	{
		if(!l||!r)
		{
			u=l+r;
			return ;
		}
		if(tree[l].num>tree[r].num)
		{
			u=l;
			me(tree[u].rs,tree[l].rs,r);
		//	pd(u);
		}
		else
		{
			u=r;
		//	pd(u);
			me(tree[u].ls,l,tree[r].ls);
		}
		pu(u);
	}
	
	
	void ins(int v)
	{
		int rt1,rt2,rt3,rt4;
		sp(rt,rt1,rt2,v);
	//	print(rt1);
	//	cout<<endl;
		sp(rt1,rt3,rt4,v-1);
		if(!rt4)new_node(rt4,v,'a');
		else tree[rt4].cnt++;
		me(rt1,rt3,rt4);
		me(rt,rt1,rt2);
	}	
	
	void del(int v)
	{
		int rt1,rt2,rt3,rt4;
		sp(rt,rt1,rt2,v);
		sp(rt1,rt3,rt4,v-1);
		tree[rt4].cnt--;
		if(!tree[rt4].cnt)me(rt4,tree[rt4].ls,tree[rt4].rs);
		
		me(rt1,rt3,rt4);
		me(rt,rt1,rt2);
	}
	int rkk(int rt,int k)
	{
		int u=rt; 
		//if(out==788)print(rt),cout<<endl;
		while(1)
		{
			//if(out==788)	cout<<tree[u].v<<endl;
			
			if(tree[tree[u].ls].sz>=k)u=tree[u].ls;
			else if(tree[tree[u].ls].sz+tree[u].cnt>=k)return tree[u].v;
			else k-=tree[tree[u].ls].sz+tree[u].cnt,u=tree[u].rs;
			
			
		}
	}
	int krk(int k)
	{
		int rt1,rt2;
		sp(rt,rt1,rt2,k-1);
		int ans=tree[rt1].sz+1;
		me(rt,rt1,rt2);
		return ans;
	}
	int pre(int k)
	{
		int rt1,rt2;
		sp(rt,rt1,rt2,k-1);
	//	print(rt1);
	//	cout<<endl;
		int ans=rkk(rt1,tree[rt1].sz);
		me(rt,rt1,rt2);
		return ans;
	}
	int nex(int k)
	{
		int rt1,rt2;
		sp(rt,rt1,rt2,k);
	//	print(rt2);
	//	cout<<endl;
		int ans=rkk(rt2,1);
		me(rt,rt1,rt2);
		return ans;
	}
	
	

	
	int main()
	{
		srand(1111);
		int n;
		scanf("%d",&n);
		while(n--)
		{
			int op,x;
			scanf("%d%d",&op,&x);
			if(op==1)ins(x);
			else if(op==2)del(x);
			else if(op==3)cout<<krk(x)<<'\n';
			else if(op==4)cout<<rkk(rt,x)<<'\n';
			else if(op==5)cout<<pre(x)<<'\n';
			else  cout<<nex(x)<<'\n';
//			if(op>2)out++; 
//			if(out==789)
//			{
//				cout<<op;
//				return 0;
//			}
//print(rt);
		}
		return 0;
	}
}


int main()
{
//	freopen("P3369_8.in","r",stdin);
//	freopen("P3369.out","w",stdout);
	acac::main();
	return 0;
}
2024/7/11 10:23
加载中...