Cod sursa(job #1591540)

Utilizator andrei_diaconuAndrei Diaconu andrei_diaconu Data 6 februarie 2016 13:17:31
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <fstream>

#define NMax 100010

using namespace std;

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

int n, queries, set[NMax];

void doUnion(int x, int y)
{
	while (set[x] > 0)
		x = set[x];

	while (set[y] > 0)
		y = set[y];

	if (x != y) {
		if (-set[x] > -set[y]) {
			set[x] += set[y];
			set[y] = x;
		}
		else {
			set[y] += set[x];
			set[x] = y;
		}
	}
}

bool sameSet(int x, int y)
{
	while (set[x] > 0)
		x = set[x];

	while (set[y] > 0)
		y = set[y];

	if (x == y)
		return 1;
	return 0;
}

int main()
{
	f >> n >> queries;

	for (int i = 1; i <= n; i++)
		set[i] = -1;

	int cmd, x, y;
	for (int i = 1; i <= queries; i++) {
		f >> cmd >> x >> y;

		if (cmd == 1)
			doUnion(x, y);
		else {
			if (sameSet(x, y) == 1)
				g << "DA\n";
			else
				g << "NU\n";
		}
	}
}