Cod sursa(job #3339088)

Utilizator iustinola16Olariu Iustin iustinola16 Data 6 februarie 2026 10:48:09
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>

using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

const int NMAX = 1e5 + 5;

struct DSU {
    int rep[NMAX];
    int sz[NMAX];

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

    int get_rep(int a) {
        if (rep[a] == a) return a;
        return get_rep(rep[a]);
    }

    bool same_set(int a, int b) {
        int ra = get_rep(a);
        int rb = get_rep(b);

        return ra == rb;
    }

    void join(int a, int b) {
        int ra = get_rep(a);
        int rb = get_rep(b);

        if (ra == rb) return;

        if (sz[a] < sz[b]) swap(ra, rb);

        rep[rb] = ra;
        sz[ra] += sz[rb];
    }
};

int main()
{
    int n, q;
    fin >> n >> q;

    DSU dsu(n);

    while (q--) {
        int t, a, b;
        fin >> t >> a >> b;

        if (t == 1) dsu.join(a, b);
        else if (dsu.same_set(a, b)) fout << "DA \n";
        else fout << "NU \n";
    }
    return 0;
}