并查集每一个点的信息记录的其实都是根节点的信息。
更新的时候不断递归出根节点的信息,然后更新自己的信息就可以了。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int set[30005],cnt[30005],num[30005];
int find(int x)
{
if(x!=set[x]){
int S=set[x];
set[x]=find(set[x]);
num[x]+=num[S];
}
return set[x];
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<=30000;i++)
{
num[i]=0;
cnt[i]=1;
set[i]=i;
}
while(n--)
{
int a,b;
char op[5];
scanf("%s",op);
if(op[0]=='M')
{
scanf("%d%d",&a,&b);
int x=find(a);
int y=find(b);
if(x==y)continue;
set[x]=y;
num[x]=cnt[y];
cnt[y]+=cnt[x];
}
else
{
scanf("%d",&a);
find(a);
printf("%d\n",num[a]);
}
}
}
return 0;
}