Cod sursa(job #3272913)

Utilizator BledeaAlexBledea Alexandru BledeaAlex Data 31 ianuarie 2025 15:44:55
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <bits/stdc++.h>

using namespace std;

const int N_MAX = 1e5 + 5;
int N, M;

int T[N_MAX];
int Rank[N_MAX];

void SetInput(string name)
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    (void)!freopen((name + ".in").c_str(), "r", stdin);
    (void)!freopen((name + ".out").c_str(), "w", stdout);
}

int FindSet(int nod)
{
    if(T[nod] != nod)
        T[nod] = FindSet(T[nod]);

    return T[nod];
}

void UniteSet(int a, int b)
{
    a = FindSet(a);
    b = FindSet(b);

    if(a == b)
        return;

    if(Rank[a] < Rank[b])
        swap(a, b);

    T[b] = a;
    if(Rank[a] == Rank[b])
        Rank[a]++;
}

void ReadInput()
{
    cin >> N >> M;
}

void Solve()
{
    for(int i = 1; i <= N; i++)
    {
        T[i] = i;
        Rank[i] = 1;
    }

    for(int i = 0, t, a, b; i < M; i++)
    {
        cin >> t >> a >> b;
        switch(t)
        {
        case 1:
            UniteSet(a, b);
            break;
        case 2:
            if(FindSet(a) == FindSet(b))
                cout << "DA\n";
            else
                cout << "NU\n";
            break;
        }
    }
}

int main()
{
    SetInput("disjoint");

    ReadInput();
    Solve();

    return 0;
}