带权并查集,11分
只有第一个点过了
#include<bits/stdc++.h>
using namespace std;
int fa[300001],val[300001];
int findn(int x)
{
if(fa[x]==x) return x;
else
{
int tmp=findn(fa[x]);
val[x]+=val[fa[x]];
fa[x]=tmp;
return tmp;
}
}
void merge(int x,int y)
{
fa[x]=y;
val[x]=1;
return;
}
int ys(int x)
{
if(x==0) return 0;
else if(x>0) return x-1;
else return x*(-1)-1;
}
int main()
{
for(int i=1;i<=30000;i++)
{
fa[i]=i;
val[i]=0;
}
int t;
cin>>t;
for(int i=1;i<=t;i++)
{
char op;
int x,y;
cin>>op>>x>>y;
int fx=findn(x),fy=findn(y);
if(op=='M')
{
merge(fx,fy);
}
else
{
if(fx!=fy) cout<<-1<<endl;
else cout<<ys(val[x]-val[y])<<endl;
}
}
return 0;
}