Cod sursa(job #2566228)

Utilizator SqueekDanielTodasca Daniel SqueekDaniel Data 2 martie 2020 19:48:29
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.83 kb
#include <bits/stdc++.h>

#define MAXN        200005
#define FILENAME    std::string("disjoint")

std::ifstream input (FILENAME+".in");
std::ofstream output(FILENAME+".out");

int N, M, sets;
int parent[MAXN], rang[MAXN];
int _find(int x) {
    if (x == parent[x]) return x;
    return parent[x] = _find(parent[x]);
}
void _union(int x, int y) {
    if (x == y) return;
    -- sets;
    if (rang[x] < rang[y])  parent[x] = y;
    else                    parent[y] = x;
    if (rang[x] == rang[y]) ++ rang[x];
}

int main()
{
    input >> N >> M; sets = N;
    for (int i=1; i<=N; ++i) parent[i] = i;
    for (int i=1, t, x, y; i<=M; ++i) {
        input >> t >> x >> y;
        if (t == 1) _union(_find(x), _find(y));
        else        output << (_find(x) == _find(y) ? "DA\n" : "NU\n");
    }

    return 0;
}