Cod sursa(job #2612249)

Utilizator Alex_tz307Lorintz Alexandru Alex_tz307 Data 8 mai 2020 18:18:09
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <bits/stdc++.h>
#define nmax 131072

using namespace std;

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

int n, m, TT[nmax], RG[nmax];

void Close () {
    fin.close();
    fout.close();
}

int Find (int x) {
    int R, y;
    for (R = x; TT[R] != R; R = TT[R]);
    for ( ; TT[x] != x;) {
        y = TT[x];
        TT[x] = R;
        x = y;
    }
    return R;
}

void Unite (int x, int y) {
    if (RG[x] > RG[y]) TT[y] = x;
    else TT[x] = y;
    if (RG[x] == RG[y]) RG[y] ++;
}

int main() {
    int op, x, y;
    fin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        TT[i] = i;
        RG[i] = 1;
    }
    for (int i = 1; i <= m; ++i) {
        fin >> op >> x >> y;
        if (op == 2) {
            if (Find(x) == Find(y)) fout << "DA\n";
            else fout << "NU\n";
        } else Unite (Find(x), Find(y));
    }
    Close ();
    return 0;
}