Cod sursa(job #2372911)

Utilizator MocalinnoMoca Andrei Catalin Mocalinno Data 7 martie 2019 11:30:37
Problema Paduri de multimi disjuncte Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.02 kb
#include <bits/stdc++.h>
#define DAU std::ios::sync_with_stdio(false); fin.tie(0); fout.tie(0);
#define PLEC fin.close(); fout.close(); return 0;
/// DAU si PLEC !!!
using namespace std;
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
const int N = 100002;
int n, Q, op, x, y, rep[N], l[N], rx, ry;
inline int Find(int x)
{
    while (rep[x] != x)
        x = rep[x];
    return x;
}
inline void Union(int x, int y)
{
    rx = Find(x);
    ry = Find(y);
    if (rx != ry)
    {
        if (l[rx] > l[ry])
            rep[ry] = rx, l[rx] += l[ry];
        else rep[rx] = ry, l[ry] += l[rx];
    }
}
inline void Verif(int x, int y)
{
    rx = Find(x);
    ry = Find(y);
    if (rx == ry)
        fout << "DA\n";
    else fout << "NU\n";
}
int main()
{
    DAU
    fin >> n >> Q;
    for (int i = 1; i <= n; ++i)
        rep[i] = i;
    for (int q = 1; q <= Q; ++q)
    {
        fin >> op >> x >> y;
        if (op == 1)
            Union(x, y);
        else Verif(x, y);
    }
    PLEC
}