Cod sursa(job #2861653)

Utilizator vladisimovlad coneschi vladisimo Data 4 martie 2022 11:16:15
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.86 kb
#include <algorithm>
#include <cstdio>
#include <cstdlib>

int parent[2 + 100000];

int getRoot(int u) {
  if (u == parent[u])
    return u;
  else
    return parent[u] = getRoot(parent[u]);
}

bool areJoined(int u, int v) {
  return getRoot(u) == getRoot(v);
}

void join(int u, int v) {
  u = getRoot(u);
  v = getRoot(v);
  if (u != v) {
    if (rand() % 2)
      std::swap(u, v);
    parent[u] = v;
  }
}

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++)
    parent[i] = i;
  for (int i = 1; i <= m; i++) {
    int type, u, v;
    scanf("%d%d%d", &type, &u, &v);
    if (type == 1)
      join(u, v);
    else {
      if (areJoined(u, v))
        printf("DA\n");
      else
        printf("NU\n");
    }
  }
  return 0;
}