Cod sursa(job #228324)

Utilizator DastasIonescu Vlad Dastas Data 6 decembrie 2008 22:59:07
Problema Paduri de multimi disjuncte Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <cstdio>

const int maxn = 100001;

FILE *in = fopen("disjoint.in","r"), *out = fopen("disjoint.out","w");

int n, m;
int t[maxn], h[maxn];

void merge(int x, int y)
{
    if ( h[x] > h[y] )
        t[y] = x;
    else
        t[x] = y;

    if ( h[x] == h[y] )
        ++h[x];
}

int find(int x)
{
    if ( t[x] == x )
        return x;

    t[x] = find(t[x]);

    return t[x];
}

int main()
{
    fscanf(in, "%d %d", &n, &m);

    for ( int i = 1; i <= n; ++i )
        t[i] = i;

    int x, y, z;

    for ( int i = 0; i < m; ++i )
    {
        fscanf(in, "%d %d %d", &x, &y, &z);

        if ( x == 1 )
            merge(y, z);
        else
            find(y) == find(z) ? fprintf(out, "DA\n") : fprintf(out, "NU\n");
    }

    return 0;
}