Cod sursa(job #3361753)

Utilizator livliviLivia Magureanu livlivi Data 28 iulie 2026 12:32:06
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

struct Padure {
    vector<int> tata;

    Padure(int n) {
        tata.resize(n + 1);
    }

    int rad(int a) {
        if (tata[a] == 0) {
            return a;
        }
        // optimizare pentru O(n logn)
        tata[a] = rad(tata[a]);
        return tata[a];
    }

    bool query(int a, int b) {
        return (rad(a) == rad(b));
    }

    void join(int a, int b) {
        a = rad(a);
        b = rad(b);
        tata[a] = b;
    }
};

int main() {
    ifstream cin("disjoint.in");
    ofstream cout("disjoint.out");
    int n, m; cin >> n >> m;
    Padure p(n);

    for (int i = 0; i < m; i++) {
        int op; cin >> op;
        int a, b; cin >> a >> b;
        if (op == 1) {
            p.join(a, b);
        } else {
            if (p.query(a, b)) {
                cout << "DA\n";
            } else {
                cout << "NU\n";
            }
        }
    }

    return 0;
}