带权并查集
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <algorithm>
#include <functional>
#define eps 1e-8
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3fLL
#define _clr(x,a) memset(x,a,sizeof(x))
#define min(a,b)) (a)<(b)?(a):(b)
#define max(a,b) (a)>(b)?(a):(b)
#define rep(i,n) for(int i=1;i<=n;++i)
using namespace std;
//#define sponge_wxy_code
const int MAXN = 30010;
int parent[MAXN], pos[MAXN];
void init_set() {
memset(parent, -1, sizeof(parent));
memset(pos, 0, sizeof(pos));
}
int find_set(int u) {
if(parent[u] < 0) return u;
int temp = parent[u];
parent[u] = find_set(parent[u]);
pos[u] = pos[u] + pos[temp];
return parent[u];
}
void union_set(int r1, int r2) {
pos[r2] = -parent[r1];
parent[r1] += parent[r2];
parent[r2] = r1;
return ;
}
int main() {
#ifdef sponge_wxy_code
freopen("aa.in", "r", stdin);
freopen("bb.out", "w", stdout);
#endif
int P, u, v; char op;
while(scanf("%d", &P) != EOF) {
init_set();
while(P--) {
cin >> op;
if(op == 'M') {
scanf("%d %d", &u, &v);
int r1 = find_set(u), r2 = find_set(v);
if(r1 == r2) continue;
union_set(r1, r2);
} else {
scanf("%d", &u);
int r1 = find_set(u);
printf("%d\n", -parent[r1] - pos[u] - 1);
}
}
}
return 0;
}