Cod sursa(job #1850006)

Utilizator msciSergiu Marin msci Data 18 ianuarie 2017 01:15:18
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>

using namespace std;

struct UnionFind {
  vector<int> par;
  vector<int> rank;
  vector<int> size; 
  int c;

  UnionFind(int n) : par(n), rank(n, 0), size(n, 1), c(n) {
    for (int i = 0; i < n; i++) {
      par[i] = i;
    }
  }

  int find(int i) { 
    return (par[i] == i ? i : (par[i] = find(par[i]))); 
  }

  bool same(int i, int j) { 
    return find(i) == find(j);
  }

  int get_size(int i) {
    return size[find(i)];
  }

  int count() { 
    return c; 
  }

  void merge(int i, int j) {
    i = find(i), j = find(j);
    if (i == j) {
      return;
    }
    c--;
    if (rank[i] > rank[j]) {
      swap(i, j);
    }
    par[i] = j; 
    size[j] += size[i];
    if (rank[i] == rank[j]) {
      rank[j]++;
    }
  }
};

int main() {
  freopen("disjoint.in", "r", stdin);
  freopen("disjoint.out", "w", stdout);
  int n, m;
  scanf("%d %d", &n, &m);
  UnionFind uf(n);
  for (int i = 0; i < m; i++) {
    int c, x, y;
    scanf("%d %d %d", &c, &x, &y);
    x--, y--;
    if (c == 1) {
      uf.merge(x, y);
    } else {
      puts(uf.same(x, y) ? "DA" : "NU");
    }
  }
  return 0;
}