Cod sursa(job #2912424)

Utilizator AndreiCroitoruAndrei Croitoru AndreiCroitoru Data 8 iulie 2022 12:34:21
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>

using namespace std;

int const N = 100001;
int sef[N];

int sefsuprem(int n) // calculeaza radacina subarborelui unde se afla n
{
    if(sef[n] == n)
        return n;
    sef[n] = sefsuprem(sef[n]);
    return sef[n];
}

void uneste(int a, int b) // reuneste multimea elementului a cu cea a elementului b
{
    int sefa = sefsuprem(a);
    int sefb = sefsuprem(b);
    sef[sefb] = sefa;
}

int main()
{
    ifstream cin("disjoint.in");
    ofstream cout("disjoint.out");
    int n, q;
    cin >> n >> q;
    for(int i = 1; i <= n; i++)
    {
        sef[i] = i;
    }
    for(int i = 1; i <= q; i++)
    {
        int c, x, y;
        cin >> c >> x >> y;
        if(c == 1)
        {
            uneste(x, y);
        }
        else
        {
            if(sefsuprem(x) == sefsuprem(y))
                cout << "DA\n";
            else
                cout << "NU\n";
        }
    }
    return 0;
}