#include <cstring>
#include <iostream>
using namespace std;
int parent[30005];
int sum[30005];
int getroot(int a)
{
if (parent[a] != a)
{
int ra = getroot(parent[a]);
int pa = parent[a];
int num = sum[a];
if(pa != ra)
sum[a] = num + sum[pa];
parent[a] = ra;
}
return parent[a];
}
bool query(int a, int b)
{
return getroot(a) == getroot(b);
}
void merge(int a, int b)
{
int fa = getroot(a);
int fb = getroot(b); //在GetRoot 和 Merge中维护必要的信息
if (fa != fb)
{
int tmp = sum[fa];
sum[fa] = tmp + sum[fb] + 1;
sum[fb] = tmp + 1;
parent[fb] = fa; //total[p1] += total[p2];
}
return;
}
void init(int n)
{
for (int i = 0; i <= n; i++)
{
parent[i] = i;
sum[i] = 0;
}
}
int getans(int a)
{
int ra = getroot(a);
if(ra == a)
return sum[a];
return sum[ra] - sum[a];
}
int main()
{
freopen("i", "r", stdin);
freopen("o", "w", stdout);
int n;
cin >> n;
init(30003);
for (int t = 0; t < n; t++)
{
char c;
cin >> c;
if(c == 'M')
{
int a, b;
cin >> a >> b;
merge(a, b);
}
else
{
int a;
cin >> a;
cout << getans(a) << endl;
}
}
return 0;
}
poj cube stacking
最新推荐文章于 2021-02-04 00:34:54 发布