Cod sursa(job #1392461)

Utilizator Theodor1000Cristea Theodor Stefan Theodor1000 Data 18 martie 2015 17:49:21
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 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;
}