Cod sursa(job #3298497)

Utilizator Cristian_5APuscasu Marian Cristian Cristian_5A Data 30 mai 2025 16:31:19
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

vector<int> tata(100001);
vector<int> inaltime(100001);

int radacina(int nod) {
	int root = nod;
	while (root != tata[root])
    {
		root = tata[root];
	}
	while (nod != root)
	{
		int nextnod = tata[nod];
		tata[nod] = root;
		nod = nextnod;
	}
	return root;
}

void uneste(int x, int y) {
	int radacinaX = radacina(x);
	int radacinaY = radacina(y);
	if (inaltime[radacinaX] < inaltime[radacinaY])
    {
		tata[radacinaX] = radacinaY;
	} else if (inaltime[radacinaX] > inaltime[radacinaY])
	{
		tata[radacinaY] = radacinaX;
	} else
	{
		tata[radacinaX] = radacinaY;
		inaltime[radacinaY] += 1;
	}
	return;
}

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

int main() {
	int n, m;
	fin >> n >> m;
	for (int i = 1; i <= n; ++i)
    {
		tata[i] = i;
		inaltime[i] = 1;
	}
	for (int i = 0; i < m; ++i)
	{
		int op, x, y;
		fin >> op >> x >> y;
		if (op == 1)
        {
			uneste(x, y);
		}
		else
		{
			if (radacina(x) == radacina(y))
			{
				fout << "DA\n";
			} else
			{
				fout << "NU\n";
			}
		}
	}
	return 0;
}