Cod sursa(job #2384268)

Utilizator stoicaandreiStoica Marius-Andrei stoicaandrei Data 20 martie 2019 16:01:51
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.72 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("disjoint.in");
ofstream fout("disjoint.out");

const int N_MAX = 1e5 + 5;

int n, m;
int t[N_MAX], d[N_MAX];

int find(int x)
{
  int r, y;
  for (r = x; t[r] != r; r = t[r]);

  for (;t[x]!=x;)
  {
    y = t[x];
    t[x] = r;
    x = y;
  }
  return r;
}

void unite(int x, int y)
{
  if (d[x] > d[y])
    t[y] = x;
  else
    t[x] = y;
  
  if (d[x] == d[y])
    d[x] ++;
}

int main() {
  fin >> n >> m;

  for (int i = 1; i <= n; i ++)
    t[i] = i, d[i] = 1;

  int c, x, y;
  for (int i = 0; i < m; i ++)
  {
    fin >> c >> x >> y;
    if (c == 1)
    {
      unite(find(x), find(y));
    } 
    else 
    {
      fout << (find(x) == find(y) ? "DA\n" : "NU\n");
    }
  }
}