Cod sursa(job #2938714)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 12 noiembrie 2022 15:09:15
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("disjoint.in");
ofstream cout("disjoint.out");

class DSU {
private:
    vector<int> dad, sz;

public:
    explicit DSU(int n) {
        dad.resize(n);
        sz.resize(n);

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

    int root(int node) {
        if (node == dad[node]) {
            return node;
        }

        return dad[node] = root(dad[node]); // path compression
    }

    void join(int p, int q) {
        p = root(p);
        q = root(q);

        if (p == q) {
            return;
        }

        // union by size
        if (sz[p] > sz[q]) {
            dad[q] = p;
            sz[p] += sz[q];
        } else {
            dad[p] = q;
            sz[q] += sz[p];
        }
    }
};

int main() {
    int n, m;
    cin >> n >> m;

    DSU dsu(n);

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

        if (t == 1) {
            dsu.join(x, y);
        } else {
            cout << (dsu.root(x) == dsu.root(y) ? "DA" : "NU") << '\n';
        }
    }

    return 0;
}