Cod sursa(job #2644066)

Utilizator JackstilAdascalitei Alexandru Jackstil Data 23 august 2020 07:02:25
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <bits/stdc++.h>
#define NMAX 100001

using namespace std;

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

int n, m, operatie, x, y, nivel[NMAX], tati[NMAX];

int radacina(int k) {
    int x = k, y;

    while (tati[x] != x)
        x = tati[x];

    while (tati[k] != k) {
        y = tati[k];
        tati[k] = x;
        k = y;
    }

    return x;
}

void uneste(int x, int y) {
    if (nivel[x] > nivel[y])
        tati[y] = x;
    else
        tati[x] = y;

    if (nivel[x] == nivel[y])
        ++nivel[y];
}

int main() {
    in >> n >> m;

    for (int i = 1; i <= n; ++i) {
            nivel[i] = i;
            tati[i] = i;
    }

    for (int i = 1; i <= m; ++i) {
        in >> operatie >> x >> y;

        if (operatie == 1)
            uneste(radacina(x), radacina(y));
        else
            out << (radacina(x) == radacina(y)? "DA\n" : "NU\n");
    }
    return 0;
}