Cod sursa(job #2714984)

Utilizator vlad_butnaruVlad Butnaru vlad_butnaru Data 2 martie 2021 19:53:30
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in ("disjoint.in");
ofstream out ("disjoint.out");
int rang[100001], tata[100001];
int n, m;
void unite (int a, int b)
{
    if (rang[a] >= rang[b])
        tata[a] = b;
    else
        tata[b] = a;
    if (rang[a] == rang[b])
        rang[a]++;
}
int Find (int a)
{
    int rad = tata[a];
    while (rad != tata[rad])
        rad = tata[rad];
    while (a != rad)
    {
        int cop = a;
        a = tata[a];
        tata[cop] = rad;
    }
    return rad;
}
int main ()
{
    in >> n >> m;
    for (int i = 1;i<=n;++i)
    {
        rang[i] = 1;
        tata[i] = i;
    }
    for (int i = 1;i<=m;++i)
    {
        int c;
        in >> c;
        if (c == 1)
        {
            int a, b;
            in >> a >> b;
            unite(a,b);
        }
        else
        {
            int a, b;
            in >> a >> b;
            if (Find(a) == Find(b))
                out << "DA\n";
            else
                out << "NU\n";
        }
    }
    return 0;
}