玄关求条
查看原帖
玄关求条
723989
zhangjizhi楼主2025/2/8 16:48

rt

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+15;
int n,idx,root,tot;
int x=0,y=0,z=0,qq=0;
string s[N];
struct Node
{
	int l,r,v,rd,size;
	string s;
}tr[N];
int get_node(string val,int rk)
{
	tr[++idx].v=rk;
	tr[idx].size=1;
	tr[idx].rd=rand();
	tr[idx].s=val;
	return idx;
}
void push_up(int u)
{
	tr[u].size=tr[tr[u].l].size+tr[tr[u].r].size+1;
}
void split(int now,int k,int &x,int &y)
{
	if(!now)
	{
		x=y=0;
		return;
	}
	if(tr[tr[now].l].size>=k)
	{
		y=now;
		split(tr[now].l,k,x,tr[now].l);
	}
	else
	{
		x=now;
		split(tr[now].r,k-tr[tr[now].l].size-1,tr[now].r,y);
	}
	push_up(now);
}
int merge(int u,int v)
{
	if(!u||!v) return u|v;
	if(tr[u].rd<tr[v].rd)
	{
		tr[u].r=merge(tr[u].r,v);
		push_up(u);
		return u;
	}
	else
	{
		tr[v].l=merge(u,tr[v].l);
		push_up(v);
		return v;
	}
}
void add(int v,string ss)
{
	split(root,v,x,y);
	root=merge(merge(x,get_node(ss,v)),y);
}
int ask(int k)
{
	split(root,k,x,y);
	split(y,1,z,qq);
	cout<<tr[z].s<<'\n';
	root=merge(x,merge(z,qq));
}
signed main()
{
	srand(time(0));
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>s[i];
		add(i-1,s[i]);
	}
	int m;
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		cin>>s[n+i];
		int x;
		cin>>x;
		add(x,s[n+i]);
	}
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		int x;
		cin>>x;
		ask(x);
	}
	return 0;
}
2025/2/8 16:48
加载中...