先添加 的在队列前 个数也代表了位置
dis[x]+=dis[pre[x]];
dis[px] = dis[py] + num[py];
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
ll q,pre[maxn],num[maxn],dis[maxn],f,x,y,ans;
//它所在的队列的大小
void init() {
for(int i=1;i<=500000+5;i++) {
pre[i]=i;
num[i]=1;
}
}
ll find(ll x) {
if(pre[x]!=x) {
pre[x]=find(pre[x]);
num[x]=num[pre[x]];
dis[x]+=dis[pre[x]];
}
return pre[x];
}
void unite(ll x,ll y) {
ll px = find(x),py = find(y);
if(px!=py) {
pre[px] = py;
dis[px] = dis[py] + num[py];//整个队列中 y之前的节点个数 就是添加之后的距离
num[py] += num[px];
num[px] = num[py];//所在的队列的节点个数
}
}
ll findans(ll x,ll y){ //2 1 3
ll px=find(x),py=find(y); //dis[1]=dis[1]+dis[2]=1+0=1 dis[3]=dis[3]+dis[2]=2+0=2 该节点之前有多少个节点
if(px!=py)
{
return -1;
}
else{
return abs(dis[x]-dis[y])-1; //间隔节点数 dis记录各自的距离
}
}
int main(){
init();
cin>>q;
while(q--){
ans=0;
cin>>f>>x>>y;
if(f==1){
unite(x,y);
}
else{
ans=findans(x,y);
cout<<ans<<endl;
}
}
return 0;
}