Cod sursa(job #2905048)

Utilizator the4Designerthe4Designer the4Designer Data 19 mai 2022 09:20:30
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>

using namespace std;

#define NMAX 100005

int parents[NMAX];
int ranks[NMAX];

int find(int x) {
    int old_x = x;
    while (x != parents[x]) {
        x = parents[x];
    }

    while (old_x != x) {
        int next = parents[old_x];
        parents[old_x] = x;
        old_x = next;
    }

    return x;
}

void unite(int x, int y) {
    if (ranks[x] < ranks[y]) {
        parents[find(x)] = find(y);
    } else {
        parents[find(y)] = find(x);
    }

    if (ranks[x] == ranks[y]) {
        ranks[x]++;
    }
}

int main(void) {
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);

    int n; cin >> n;
    int m; cin >> m;

    for (int i = 1; i <= n; ++i) {
        parents[i] = i;
        ranks[i] = 0;
    }

    for (int i = 0; i < m; ++i) {
        int op; cin >> op;
        int x, y; cin >> x >> y;

        if (op == 1) {
            unite(x, y);
        } else {
            if (find(x) == find(y)) {
                cout << "DA" << '\n';
            } else {
                cout << "NU" << '\n';
            }
        }
    }

    return 0;
}