带权并查集
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#define N 100010
using namespace std;
int f[N],low[N],size[N],n;//f means the lowest
char get_char()
{
int cnt=0;char c=getchar();
while(c!='M'&&c!='C')
{
if((c=getchar())==EOF)exit(0);
}
return c;
}
int getfa(int x)
{
if(f[x]==x)return x;
int fx=f[x];
f[x]=getfa(f[x]);
low[x]+=low[fx];//不要想父亲与祖父的关系,要着重于当前自己与父亲的关系
return f[x];
}
inline void unite(int x,int y)
{
x=getfa(x);y=getfa(y);
f[x]=y;
low[x]+=size[y];
size[y]+=size[x];
size[x]=0;//注意要清零
}
void move()
{
int x,y;
scanf("%d%d",&x,&y);
unite(x,y);
}
void count()
{
int x;
scanf("%d",&x);
getfa(x);
printf("%d\n",low[x]);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)f[i]=i,low[i]=0,size[i]=1;
while(1)
{
if(get_char()=='M')move();
else count();
}
}