abc 372 E
作者:
Air1222
,
2024-09-30 23:32:24
,
所有人可见
,
阅读 4
//并查集+set(自带顺序)
//set存代表节点的所有连接节点
#include <iostream>
#include <set>
using namespace std;
const int N = 2e5+10;
set<int,greater<int>>c[N];
int n,m;
int p[N];
int find(int x)
{
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
p[i]=i;
c[i].insert(i);
}
while(m--)
{
int op,a,b;
cin>>op>>a>>b;
a=find(a);
if(op==1)
{
b=find(b);
if(c[a].size()>c[b].size()) swap(a,b);
if(a!=b)
{
p[a]=p[b];
for(auto k:c[a])
c[b].insert(k);
}
}
else
{
if(c[a].size()<b) cout<<-1<<endl;
else
{
int cnt=0;
for(auto k:c[a])
{
cnt++;
if(cnt==b)
{
cout<<k<<endl;
break;
}
}
}
}
}
}