Cod sursa(job #2312133)

Utilizator VadimCCurca Vadim VadimC Data 4 ianuarie 2019 12:32:20
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.71 kb
#include <iostream>
#include <fstream>

using namespace std;

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

#define NMax 100005

int n, m;
int tata[NMax], h[NMax];

int Find(int);
void Union(int, int);

int main(){
	int op, x, y;
	fin >> n >> m;
	while(m--){
		fin >> op >> x >> y;
		if(op == 1) Union(x, y);
		else if(Find(x) == Find(y)) fout << "DA\n";
		else fout << "NU\n";
	}
}

void Union(int x, int y){
	x = Find(x);
	y = Find(y);
	if(h[x] > h[y])
		tata[y] = x;
	else{
		tata[x] = y;
		if(h[x] == h[y]) h[y]++;
	}
}

int Find(int x){
	int aux, p = x;
	while(tata[p]) p = tata[p];
	while(x != p){
		aux = tata[x];
		tata[x] = p;
		x = aux;
	}
	return p;
}