Cod sursa(job #2526806)

Utilizator CosminMorarMorar Cosmin Andrei CosminMorar Data 19 ianuarie 2020 11:25:53
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int n, m, cod, a, b;
int rang[100010], tt[100010];

int find(int x) {
    int r;

    for (r = x; tt[r] != r; r = tt[r]);

    for (; tt[x] != x;) {
        int y = tt[x];
        tt[x] = r;
        x = y;
    }
}

void unite(int x, int y) {
    if (rang[x] > rang[y])
        tt[y] = x;
    else
        tt[x] = y;

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

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

    for (int i = 1; i <= n; i++) {
        rang[i] = 1;
        tt[i] = i;
    }

    for (int h = 1; h <= m; h++) {
        fin >> cod >> a >> b;

        if (cod == 1)
            unite(find(a), find(b));
        else {
            if (find(a) == find(b))
                fout << "DA\n";
            else
                fout << "NU\n";
        }
    }
    return 0;
}