#include <bits/stdc++.h>
#define endl "\n"
using namespace std;
const int maxn=5e5+5;
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
}
return x * f;
}
int n;
struct UFD_set{
int siz[maxn],fa[maxn],dis[maxn];
void init() {
for(int i=1;i<=n;i++) fa[i]=i, siz[i]=1;
}
inline int Qfind_set(int x){
int ret=x;
while(fa[ret]!=ret) ret=fa[ret];
int i = x, j;
while(i!=ret) {
j=fa[i];
fa[i]=ret;
i=j;
}
return ret;
}
inline int find_set(int x) {
if(fa[x]==x) return x;
return find_set(fa[x]);
}
void Qmerge(int x, int y) {
int fx=Qfind_set(x), fy=Qfind_set(y);
if(siz[fx]<siz[fy]) fa[fx]=fy, siz[fy]+=siz[fx];
else fa[fy]=fx, siz[fx]+=siz[fy];
}
void merge(int x, int y) {
int fx=find_set(x), fy=find_set(y);
fa[fx]=fy, dis[fx]=siz[fy], siz[fy]+=siz[fx];
}
int query(int x, int y) {
int fx=find_set(x), fy=find_set(y);
if(fx!=fy) return -1;
int dis1=0,dis2=0;
while(fa[x]!=x) dis1+=dis[x],x=fa[x];
while(fa[y]!=y) dis2+=dis[y],y=fa[y];
return abs(dis2-dis1)-1;
}
} s;
int main() {
n=read();
s.init();
for(int i=1,x,y;i<=n;i++){
char op;scanf("%c",&op);
x=read(),y=read();
if(op=='M') s.merge(x,y);
else cout<<s.query(x,y)<<endl;
}
return 0;
}
本地AC交上去全WA
各种方法无解求教qwq