Cod sursa(job #2094730)

Utilizator AndreiTurcasTurcas Andrei AndreiTurcas Data 26 decembrie 2017 14:39:58
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <iostream>
#include <fstream>
#define mx 100005

using namespace std;

ifstream f("disjoint.in");
ofstream g("disjoint.out");

int T[mx], L[mx], n, m;

int Find(int x)
{
    int R, y;
    for(R = x; T[R] != R; R = T[R]); // gasire radacina
    while(T[x] != x)
    {
        y = T[x];                    // compresie drum
        T[x] = R;
        x = y;
    }
    return R;
}

void Union(int x, int y)
{
    if(L[x] > L[y])
        T[y] = x;
    else
        T[x] = y;
    if(L[x] == L[y]) ++L[y];
}

int main()
{
    f >> n >> m;
    for(int i = 1; i <= n; ++i)
    {
        T[i] = i;
        L[i] = 1;
    }
    for(; m; --m)
    {
        int cod, x, y;
        f >> cod >> x >> y;
        if(cod == 1)
        {
            int xx = Find(x), yy = Find(y);
            if(xx != yy)
                Union(xx, yy);
        }
        else
        {
            if(Find(x) == Find(y))
                g << "DA\n";
            else g << "NU\n";
        }
    }
}