Cod sursa(job #1414702)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 2 aprilie 2015 21:55:57
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <cstdio>

using namespace std;

int t[100010], r[100010];

int find (int x)
{
    int r = x;
    for (; r != t[r]; r = t[r]);

    while (t[x] != x)
    {
        int cx = t[x];
        t[x] = r;
        x = cx;
    }

    return r;
}

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

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

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

    int n, m;
    scanf ("%d %d", &n, &m);

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

    for (int i = 1; i <= m; ++i)
    {
        int x, y, o;
        scanf ("%d %d %d", &o, &x, &y);

        if (o == 1) uni (find (x), find (y));
        else if (find (x) == find (y)) printf ("DA\n");
        else printf ("NU\n");
    }

    return 0;
}