Cod sursa(job #2142322)

Utilizator HumikoPostu Alexandru Humiko Data 24 februarie 2018 22:14:27
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <bits/stdc++.h>
#define nmax 100005

using namespace std;

ifstream fin ("disjoint.in");
ofstream fout ("disjoint.out");

int n, m, h[nmax], tata[nmax];

int parinte(int a)
{
    int c_a = a;
    while ( a != tata[a] )
        a = tata[a];
    while ( c_a != a )
    {
        int aux = c_a;
        c_a = tata[c_a];
        tata[aux] = a;
    }
    return a;
}

void unire(int x, int y)
{
    int a = parinte(x);
    int b = parinte(y);
    if ( a == b )
        return;
    if ( h[a] > h[b] )
        tata[b] = a;
    else
    {
        tata[a] = b;
        if ( h[a] == h[b] )
            h[a++];
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);
    fin>>n>>m;
    for ( int i = 1; i <= n; ++i )
    {
        tata[i] = i;
        h[i] = i;
    }
    for ( int i = 1; i <= m; ++i )
    {
        int cod, x, y;
        fin>>cod>>x>>y;
        if ( cod == 1 )
            unire(x, y);
        if ( cod == 2 )
            if ( parinte(x) == parinte(y) )
                fout<<"DA"<<'\n';
            else
                fout<<"NU"<<'\n';
    }
}