nums数组维护每个堆的元素个数,当不同的两个堆合并时,要加上nums,相同堆合并时则不需要

#include <iostream>
using namespace std;
const int maxn = 30010;
struct node {
    int pre;
    int num;
}arr[maxn];
int nums[maxn];
void init() {
    for (int i = 0; i < maxn; i++) {
        arr[i].pre = i;
        arr[i].num = 0;
        nums[i] = 1;
    }
}
int find(int x) {
    if (x == arr[x].pre)return x;
    int temp = arr[x].pre;
    arr[x].pre = find(temp);
    arr[x].num += arr[temp].num;
    return arr[x].pre;
}

int main()
{
    int n;
    cin >> n;
    init();
    while (n--) {
        char c;
        cin >> c;
        if (c == 'M') {
            int num1, num2;
            cin >> num1 >> num2;
            int fa = find(num1);
            int fb = find(num2);
            if (fa == fb) {
                arr[num1].num += arr[num2].num;
            }
            else {
                arr[fa].pre = fb;
                arr[fa].num += nums[fb];
                nums[fb] += nums[fa];
            }
        }
        else {
            int num3;
            cin >> num3;
            find(num3);
            cout << arr[num3].num << endl;
        }
    }
}