Cod sursa(job #3309683)

Utilizator MXelAMocanu Alexandru-Matei MXelA Data 7 septembrie 2025 15:14:11
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb

#include <iostream>
#include  <fstream>

using namespace std;

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

const int Nmax = 1e5+5;

int n,m;

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 node) {
        if (rep[node]==node)
            return node;
        return rep[node]=get_rep (rep[node]);
    }

    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[ra]<sz[rb])
            swap (ra, rb);

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

    }
};

int main () {
    fin >> n >> m;
    DSU dsu(n);
    int t,a,b;

    while (m--) {
        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;
}