Cod sursa(job #1611100)

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

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

int T[100010], N, Q;
queue<int> q;
void join(int x, int y)
{
	int x1 = x, y1 = y;
	while (T[x] > 0)
	{
		q.push(x);
		x = T[x];
	}
	while (T[y] > 0)
	{
		q.push(y);
		y = T[y];
	}

	if (T[x] < T[y])
	{
		T[x] += T[y];
		T[y] = x;
		while (q.size())
		{
			T[q.front()] = x;
			q.pop();
		}
		
	}
	else
	{
		T[y] += T[x];
		T[x] = y;
		while (q.size())
		{
			T[q.front()] = y;
			q.pop();
		}
	}
	
}
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;
}