FHQ!样例不过!求大佬调
查看原帖
FHQ!样例不过!求大佬调
776751
W0718楼主2025/2/7 16:24
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1000000+1111;
int m,q,c,n;
int tot,root;
struct node{
	int lc,rc,val;
	int siz,pri;
}tr[maxn];
void pushup(int r)
{
	tr[r].siz=tr[tr[r].lc].siz+tr[tr[r].rc].siz+1;
}
void split(int u,int x,int &L,int &R)
{
	if(!u)
	{
		L=R=0;
		return ;
	}
	if(tr[u].val<=x)
	{
		L=u;
		split(tr[u].rc,x,tr[u].rc,R);
	}
	else{
		R=u;
		split(tr[u].lc,x,L,tr[u].lc);
	}
	pushup(u);
}
int merge(int L,int R)
{
	if(!L||!R)return L+R;
	if(tr[L].pri<tr[R].pri)
	{
		tr[L].rc=merge(tr[L].rc,R);
		pushup(L);
		return L;
	}
	
	tr[R].lc=merge(L,tr[R].lc);
	pushup(R);
	return R;
}
void newnode(int x)
{
	tot++;
	tr[tot].siz=1;tr[tot].val=x;tr[tot].pri=rand();
	tr[tot].lc=tr[tot].rc=0;
}
void insert(int x)
{
	int L=0,R=0;
	newnode(x);
	split(root,x,L,R);
	root=merge(merge(L,tot),R);
}
int kth(int u,int k)
{
	if(k==tr[tr[u].lc].siz+1) return u;
	if(k<=tr[tr[u].lc].siz) return kth(tr[u].lc,k);
	return kth(tr[u].rc,k-tr[tr[u].lc].siz-1);
}
signed main()
{
	srand(time(NULL));
	int temp;
	scanf("%lld %lld",&m,&q);
	for(int i=1;i<=m;i++)
	{
		scanf("%lld",&temp);
		insert(temp);
	}
	for(int i=1;i<=q;i++)
	{
		scanf("%lld %lld",&c,&n);
		if(c==1)
		{
			printf("%lld\n",kth(root,n));
		}
		if(c==2)
		{
			insert(n);
		}
	}
	return 0;
}
2025/2/7 16:24
加载中...