Cod sursa(job #1753687)

Utilizator Burbon13Burbon13 Burbon13 Data 6 septembrie 2016 22:38:46
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>

using namespace std;

const int nmx = 100002;

int n,m;
int val[nmx],tata[nmx];

void initializare()
{
    for(int i = 1; i <= n; ++i)
    {
        val[i] = 1;
        tata[i] = i;
    }
}

int da_grupa(int nod)
{
    int aux = nod;

    while(nod != tata[nod])
        nod = tata[nod];

    while(aux != tata[aux])
    {
        int aux2 = tata[aux];
        tata[aux] = nod;
        aux = aux2;
    }

    return nod;
}

void uneste(int nod1, int nod2)
{
    if(val[nod1] > val[nod2])
        tata[nod2] = nod1;
    else
        tata[nod1] = nod2;

    if(val[nod1] == val[nod2])
        ++ val[nod2];
}

void citire()
{
    scanf("%d %d", &n, &m);
    initializare();
    for(int i = 1; i <= m; ++i)
    {
        int operatie, nod1, nod2;
        scanf("%d %d %d", &operatie, &nod1, &nod2);
        if(operatie == 1)
            uneste(da_grupa(nod1),da_grupa(nod2));
        else
            printf("%s\n", da_grupa(nod1) == da_grupa(nod2) ? "DA" : "NU");
    }
}

int main()
{
    freopen("disjoint.in", "r", stdin);
    freopen("disjoint.out", "w", stdout);
    citire();
    return 0;
}