Cod sursa(job #1392516)

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