Cod sursa(job #3300338)

Utilizator parrot279Sofi Tudose parrot279 Data 14 iunie 2025 20:29:00
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>

using namespace std;
ifstream cin("disjoint.in");
ofstream cout("disjoint.out");

int parinte[100001], n, m, rang[100001];
int radacina(int nod);
void uneste(int x, int y);

int main()
{
    cin>>n>>m;
    for(int i = 1; i <= n; ++i)
        parinte[i] = i;
    for(int i = 1; i <= m; ++i)
    {
        int operatie, x, y;
        cin>>operatie>>x>>y;
        if(operatie == 1)
        {
            uneste(x, y);
        }
        else
        {
            if(radacina(x) == radacina(y))
                cout<<"DA\n";
            else
                cout<<"NU\n";
        }
    }
    return 0;
}

void uneste(int x, int y)
{
    int radx = radacina(x), rady = radacina(y);
    if(rang[radx] < rang[rady])
    {
        parinte[radx] = rady;
    }
    else if(rang[radx] > rang[rady])
    {
        parinte[rady] = radx;
    }
    else
    {
        parinte[rady] = radx;
        rang[rady]++;
    }
}

int radacina(int nod)
{
    int rad = nod;
    while(parinte[rad] != rad)
        rad = parinte[rad];

    while(parinte[nod] != rad)
    {
        int aux = nod;
        nod = parinte[nod];
        parinte[aux] = rad;
    }
    return rad;
}