Cod sursa(job #3357879)

Utilizator TestLicenta123Test Test TestLicenta123 Data 13 iunie 2026 19:21:31
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <iostream>
#include <vector>
#include <fstream>

int find_root(int node, std::vector<int> &roots) {
    if (roots[node] != node) {
        roots[node] = find_root(roots[node], roots);
    }
    return roots[node];
}

int main() {
    std::ifstream input("disjoint.in");
    std::ofstream output("disjoint.out");

    int n, m;
    input >> n >> m;

    std::vector<int> roots(n + 1);
    std::vector<int> rank(n + 1, 0);
    for (int i = 1; i <= n; ++i) roots[i] = i;

    while (m--) {
        int op, x, y;
        input >> op >> x >> y;
        int r1 = find_root(x, roots);
        int r2 = find_root(y, roots);

        if (op == 1) {
            if (r1 != r2) {
                if (rank[r1] < rank[r2]) {
                    roots[r1] = r2;
                } else if (rank[r1] > rank[r2]) {
                    roots[r2] = r1;
                } else {
                    roots[r2] = r1;
                    rank[r1]++;
                }
            }
        } else {
            output << (r1 == r2 ? "DA" : "NU") << '\n';
        }
    }

    return 0;
}