Cod sursa(job #1475663)

Utilizator salam1Florin Salam salam1 Data 24 august 2015 11:36:19
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100505;
int n, m, parent[NMAX], rnk[NMAX];

void makeSet(int v) {
  parent[v] = v;
  rnk[v] = 0;
}

int findSet(int v) {
  if (v == parent[v])
    return v;
  return parent[v] = findSet(parent[v]);
}

void unionSets(int a, int b) {
  a = findSet(a); b = findSet(b);
  if (a != b) {
    if (rnk[b] < rnk[a]) {
      swap(a, b);
    }
    parent[a] = b;
    if (rnk[a] == rnk[b])
      rnk[b]++;
  }
}

void readAndPrepare() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++)
    makeSet(i);
}

void solve() {
  int type, a, b;
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d", &type, &a, &b);
    switch (type) {
      case 1: {
        unionSets(a, b);
        break;
      }
      case 2: {
        if (findSet(a) == findSet(b)) {
          printf("DA\n");
        } else {
          printf("NU\n");
        }
        break;
      }
    }
  }
}

int main() {
  freopen("disjoint.in", "r", stdin);
  freopen("disjoint.out", "w", stdout);
  
  readAndPrepare();
  solve();
  return 0;
}