|
@@ -0,0 +1,53 @@
|
|
|
+#include <cstdio>
|
|
|
+
|
|
|
+using namespace std;
|
|
|
+
|
|
|
+const int N = 30000;
|
|
|
+
|
|
|
+struct UF {
|
|
|
+ int id[N + 1];
|
|
|
+ int sz[N + 1];
|
|
|
+ int ud[N + 1];
|
|
|
+};
|
|
|
+
|
|
|
+UF uf;
|
|
|
+
|
|
|
+int find(int i) {
|
|
|
+ if (i == uf.id[i]) return i;
|
|
|
+ int j = find(uf.id[i]);
|
|
|
+ uf.ud[i] += uf.ud[uf.id[i]];
|
|
|
+ uf.id[i] = j;
|
|
|
+ return j;
|
|
|
+}
|
|
|
+
|
|
|
+void move(int i, int j) {
|
|
|
+ i = find(i);
|
|
|
+ j = find(j);
|
|
|
+ if (i == j) return;
|
|
|
+ uf.ud[i] = uf.sz[j];
|
|
|
+ uf.id[i] = j;
|
|
|
+ uf.sz[j] += uf.sz[i];
|
|
|
+}
|
|
|
+
|
|
|
+int main() {
|
|
|
+ int p;
|
|
|
+ scanf("%d", &p);
|
|
|
+ for (int i = 1; i <= N; i++) {
|
|
|
+ uf.id[i] = i;
|
|
|
+ uf.sz[i] = 1;
|
|
|
+ uf.ud[i] = 0;
|
|
|
+ }
|
|
|
+ char op[2];
|
|
|
+ for (int i = 0, x, y; i < p; i++) {
|
|
|
+ scanf("%s", op);
|
|
|
+ if (op[0] == 'C') {
|
|
|
+ scanf("%d", &x);
|
|
|
+ find(x);
|
|
|
+ printf("%d\n", uf.ud[x]);
|
|
|
+ } else {
|
|
|
+ scanf("%d %d", &x, &y);
|
|
|
+ move(x, y);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|