话说这不是bct创客大赛普及组的第三题吗
#include <bits/stdc++.h>
#define int long long
using namespace std;
int read() {
int x;
scanf ("%lld", &x);
return x;
/*
char ch;
int opt = 1, num;
while (!isdigit(ch = getchar())) {
if (ch == '-')
opt = -1;
}
num = ch ^ 48;
while (isdigit(ch = getchar()))
num = (num << 3LL) + (num << 1LL) + (ch ^ 48);
return num * opt;
*/
}
const int N = 1e6 + 233;
int fa[N], w[N], fr[N];
int find(int x) {
if (fa[x] == x)
return x;
int tx = find(fa[x]);
fr[x] += fr[fa[x]];
return fa[x] = tx;
}
void merge(int x, int y) {
swap (x, y);
int tx = find(x);
int ty = find(y);
fr[tx] += w[ty];
fa[tx] = ty;
w[ty] += w[tx];
}
void init(int n) {
for (int i = 1; i <= n; i ++)
fa[i] = i;
for (int i = 1; i <= n; i ++)
w[i] = 1;
for (int i = 1; i <= n; i ++)
fr[i] = 0;
}
int query(int x) {
// return w[x];
int ta = find(x);
return w[ta] - fr[x] - 1;
}
signed main() {
int n = read();
init(33333);
while (n --) {
char ch;
cin >> ch;
if (ch == 'M') {
int a, b;
a = read(), b = read();
merge(a, b);
} else {
int x;
x = read();
printf ("%lld\n", query(x));
}
}
return 0;
}