求助,赏关注,急
查看原帖
求助,赏关注,急
677127
xiaoxiaoxia楼主2023/8/10 15:44
#include<bits/stdc++.h>
using namespace std;
const  int nn=1000010;
int rt[nn], idd[nn], tot,f[nn];
struct node
{
	int ls, rs, v, w;
}t[30*nn];
int find(int x)
{
    if(rt[x]==x)return x;
    rt[x]=find(rt[x]);
    return rt[x];
}
int build(int l, int r, int x)
{
	int o=++tot;
	if(l==r)
	{
		t[o].w=1;
		return o;
	}
	int mid=(l+r)/2;
	if(x<=mid)
	{
		t[o].ls=build(l,mid,x);
	}
	else
	{
		t[o].rs=build(mid+1,r,x);
	}
	t[o].w=t[t[o].ls].w+t[t[o].rs].w;
	return o;
}
int update(int fu, int fv, int l, int r)
{
	if(fu==0)
	{
		return fv;
	}
	if(fv==0)
	{
		return fu;
	}
	if(l==r)
	{
		t[fu].w+=t[fv].w;
		return fu;
	}
	int mid=(l+r)/2;
	t[fu].ls=update(t[fu].ls,t[fv].ls,l,mid);
	t[fu].rs=update(t[fu].rs,t[fv].rs,mid+1,r);
	t[fu].w=t[t[fu].ls].w+t[t[fu].rs].w;
	return fu;
}
int query(int fu, int l, int r, int k)
{
	if(l==r)
	{
		return l;
	}
	int mid=(l+r)/2;
	int s=t[t[fu].ls].w;
	if(k<=s)
	{
		return query(t[fu].ls,l,mid,k);
	}
	else
	{
		return query(t[fu].rs,mid+1,r,s);
	}
}
int main()
{
	int n, m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>rt[i];
	}
	build(1,n,1);
	for(int i=1;i<=m;i++)
	{
		int u, v;
		cin>>u>>v;
		int fu=find(u);
		int fv=find(v);
		if(fu==fv)
		{
			continue;
		}
		f[fv]=fu;
		rt[fu]=update(rt[fu],rt[fv],1,n);
	}
	int q;
	cin>>q;
	for(int i=1;i<=q;i++)
	{
		char s[10];
		int u, v;
		cin>>s>>u>>v;
		if(s[0]=='B')
		{
			int fu=find(u);
			int fv=find(v);
			if(fu==fv)
			{
				continue;
			}
			f[fv]=fu;
			rt[fu]=update(rt[fu],rt[fv],1,n);
		}
		else
		{
			int fu=find(u);
			if(t[rt[fu]].w<v)
			{
				cout<<"-1"<<endl;
			}
			else
			{
				int k=query(rt[fu],1,n,v);
				cout<<idd[k]<<endl;
			}
		}
	}
	return 0;
}
2023/8/10 15:44
加载中...