Cod sursa(job #2374278)

Utilizator GoogalAbabei Daniel Googal Data 7 martie 2019 17:47:02
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

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

const int NMAX = 1e5;

int n, m;

int sef[1 + NMAX];
int ssz[1 + NMAX];

string output;

int get_sef(int el) {
  if(el == sef[el]) {
    return el;
  } else {
    sef[el] = get_sef(sef[el]);
    return sef[el];
  }
}

void union_vals(int x, int y) {
  int sefx = get_sef(x);
  int sefy = get_sef(y);

  if(ssz[sefy] <= ssz[sefx]) {
    ssz[sefx] += ssz[sefy];
    sef[sefy] = sefx;
  } else {
    ssz[sefy] += ssz[sefx];
    sef[sefx] = sefy;
  }
}

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

  for(int i = 1; i <= n; i++) {
    sef[i] = i;
    ssz[i] = 1;
  }

  for(int i = 1; i <= m; i++) {
    int code, x, y;

    in >> code >> x >> y;

    if(code == 1) {
      union_vals(x, y);
    } else if(code == 2) {
      int sefx = get_sef(x);
      int sefy = get_sef(y);

      if(sefx == sefy)
        output += "DA\n";
      else
        output += "NU\n";
    }
  }

  out << output;

  in.close();
  out.close();

  return 0;
}