Cod sursa(job #1611086)

Utilizator ArkinyStoica Alex Arkiny Data 23 februarie 2016 22:29:23
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<fstream>
using namespace std;

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

int T[100010], N, Q;

void join(int x, int y)
{
	int x1 = x, y1 = y;
	while (T[x]>0)
		x = T[x];
	while (T[y]>0)
		y = T[y];

	if (T[x] < T[y])
	{
		T[x] += T[y];
		T[y] = x;
		while (T[y1]>0)
		{
			int e = y1;
			y1= T[y1];
			T[e] = x;
		}
	}
	else
	{
		T[y] += T[x];
		T[x] = y;
		while (T[x1]>0)
		{
			int e = x1;
			x1 = T[x1];
			T[e] = y;
		}
	}
	
}
bool check(int x, int y)
{
	while (T[x]>0)
		x = T[x];
	while (T[y]>0)
		y = T[y];
	return (x == y);
}
int main()
{

	in >> N>>Q;

	for (int i = 1;i <= N;++i)
		T[i] = -1;

	for (int i = 1;i <= Q;++i)
	{
		int op, x, y;
		in >> op >> x >> y;
		if (op == 1)
			join(x, y);
		else  if (check(x, y))
			out << "DA\n";
		else
			out << "NU\n";
	}
	

	return 0;
}