using namespace std;
const int N = 30010;
int d[N];//代表当前节点到其祖宗节点的长度
int c[N];//当c[n](n==祖宗节点)c[n]表示当前列的大小
int fa[N];//用于并查集记录父亲节点
int find(int a)
{
if (fa[a] == a) return a;
else {
int t = find(fa[a]);
d[a] += d[fa[a]];//返回时一直更新
return fa[a]=t;//找到祖父节点一路返回,并同时进行路径压缩使得下一次访问一节点不会再对a到原祖父节点之间的dis进行重新增加,而是一步到原祖宗节点
}
}
void un(int a, int b)
{
int gfa = find(a);
int gfb = find(b);//find函数更新dis(在a的祖宗节点跟新时更新,否则会一步到祖宗节点并+=0,相当于不变)
fa[gfa] = gfb;
d[gfa] += c[gfb];
c[gfb] += c[gfa];
}
int main()
{
int m;
cin >> m;
for (int i = 1; i <=N; i++)
{
fa[i] = i;
c[i] = 1;
d[i] = 0;
}
char op;
int a, b;
while (m--)
{
cin >> op;
if (op == 'M')
{
cin >> a >> b;
un(a,b);
}
else
{
cin >> a;
find(a);//由于进行了路径压缩,且a再祖父节点改变时不一定会被访问,所以为了确保dis[a]正确性,应该调用一次find函数
cout << d[a]<<endl;
}
}