Cod sursa(job #1735789)

Utilizator ArkinyStoica Alex Arkiny Data 31 iulie 2016 00:27:01
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include<fstream>
#include<algorithm>
#include<vector>
#include<string.h>
using namespace std;

int v[200010];
int a[200010];
int level[200010];

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

void reunion(int x,int y)
{
	int r1=x, r2=y;
	while (a[r1] != 0)
		r1 = a[r1];
	while (a[r2] != 0)
		r2 = a[r2];
	if (level[r1] < level[r2])
	{
		a[r1] = r2;

		while (a[x])
		{
			int e = a[x];
			a[x] = r2;
			
			x = e;
		}

	}
	else
	{
		a[r2] = r1;

		while (a[y])
		{
			int e = a[y];
			a[y] = r1;

			y = e;
		}
	}
}

int same_set(int x, int y)
{
	int r1 = x, r2 = y;
	while (a[r1] != 0)
		r1 = a[r1];
	while (a[r2] != 0)
		r2 = a[r2];

	return r1 == r2;
}

int main()
{

	int N,M;

	in >> N >> M;

	for (int i = 1;i <= M;++i)
	{
		int op, x, y;

		in >> op >> x >> y;

		if (op == 1)
		{
			reunion(x, y);
		}
		else
		{
			out << (same_set(x,y) ? "DA\n" : "NU\n");
		}

	}

	


	return 0;
}