Cod sursa(job #3207075)

Utilizator AndreasBossGamerBaragau Andreas AndreasBossGamer Data 24 februarie 2024 22:52:39
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>
#include <vector>

using namespace std;

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

int n, q;

vector<int> parent;
vector<int> rang;

int find(int x) {
	int repX;
	for (repX = x; parent[repX] != repX; repX = parent[repX]);
	int p = repX;
	for (repX = x; parent[repX] != repX; repX = parent[repX])
	{
		parent[repX] = p;
	}
	return repX;
}

void unire(int x, int y) {
	int a = find(x);
	int b = find(y);

	if (a == b) return;

	if (rang[a] < rang[b])
		parent[a] = b;
	else if (rang[a] > rang[b])
		parent[b] = a;
	else
	{
		parent[a] = b;
		rang[b]++;
	}
}


int main()
{
	cin >> n >> q;
	parent.resize(n + 1);
	rang.resize(n + 1);
	for (int i = 1; i <= n; i++)
	{
		parent[i] = i;
	}
	while (q--)
	{
		int caz, x, y;
		cin >> caz >> x >> y;
		if (caz == 1)
		{
			unire(x, y);
		}
		else 
		{
			if (find(x) == find(y)) cout << "DA\n";
			else cout << "NU\n";
		}
	}
}