Cod sursa(job #2055595)

Utilizator GoogalAbabei Daniel Googal Data 3 noiembrie 2017 15:02:19
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <cassert>
#include <string>
#include <iostream>

using namespace std;

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

const int NMAX = 100000;
const int DIM = 1000000;

int n, m, pos;
int ssz[1 + NMAX];
int sef[1 + NMAX];
char buff[DIM];
string ans;

int read(){
  int nr = 0;

  while(!isdigit(buff[pos])){
    if(++pos == DIM){
      in.read(buff, DIM);
      pos = 0;
    }
  }

  while(isdigit(buff[pos])){
    nr = nr * 10 + (buff[pos] - '0');
    if(++pos == DIM){
      in.read(buff, DIM);
      pos = 0;
    }
  }

  return nr;
}

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

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

  for(int i = 1; i <= m; i++){
    int p, x, y;
    p = read();
    x = read();
    y = read();
    if(p == 1){
      int bx = getsef(x);
      int by = getsef(y);
      assert(bx != by);

      if(ssz[by] <= ssz[bx]){
        sef[by] = bx;
        ssz[bx] += ssz[by];
      }else{
        sef[bx] = by;
        ssz[by] += ssz[bx];
      }
    }else if(p == 2){
      if(getsef(x) == getsef(y))
        ans += "DA\n";
      else
        ans += "NU\n";
    }
  }
  assert(ans.empty() == false);
  out << ans;
  in.close();
  out.close();
  return 0;
}