#include<cstdio> using namespace std; //说难不难,说简单不简单,就是并查集的处理,额外的两个数组是关键 //解决并查集有关问题时,如何利用辅助数组记录节点与根节点的关系是解题的关键 const int N = 3e4; int father[N+5],under[N+5],sum[N+5]; //parent[i]=i,sum[i]表示砖块i所在堆的砖块数目,under[i]表示砖块i下面有多少砖块 void init(int n) { for(int i = 1; i<=n; ++i) { father[i] = i; sum[i] = 1; under[i] = 0; } } int find(int x) { if(x!=father[x]) { int px = find(father[x]); under[x] += under[father[x]];//将父节点的砖块都加上,因为父节点在x下面 father[x] = px; } return father[x]; } void _union(int a,int b) { //将a放到b上 int x = find(a); int y = find(b); if(x!=y) { father[x] = y;//父节点在下面 under[x] = sum[y];//x下面的砖块数就是y堆的个数 sum[y] += sum[x];//y堆的个数要加上x堆的个数 } } int main() { init(N); int p; int a,b; char c; scanf("%d",&p); while(p--) { getchar(); c = getchar(); if(c=='M') { scanf("%d%d",&a,&b); _union(a,b); }else{ scanf("%d",&a); find(a); printf("%d\n",under[a]); } } return 0; }