Cod sursa(job #3192069)

Utilizator AndreiMLCChesauan Andrei AndreiMLC Data 11 ianuarie 2024 13:02:29
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <deque>
#include <algorithm>
#include <set>

using namespace std;

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

const int nmax = 200005;
int viz[nmax];
int n, m;
int rang[nmax];
int dad[nmax];
int test, a, b;

int do_find(int nod) {
	if (nod != dad[nod]) {
		int repr = do_find(dad[nod]);
		dad[nod] = repr;
		return repr;
	}
	return nod;
}

void do_union(int x, int y)
{
	if (rang[x] < rang[y])
	{
		dad[x] = y;
	}
	else if (rang[y] < rang[x])
	{
		dad[y] = x;
	}
	else {
		dad[x] = y;
		rang[y]++;
	}
}
int main()
{
	f >> n >> m; 
	
	for (int i = 1; i <= n; i++) 
	{
		dad[i] = i;
		rang[i] = 1;
	}

	for (int i = 1; i <= m; i++)
	{
		f >> test >> a >> b;
		if (test == 1)
		{
			do_union(a,b);
		}
		else {
			int repr_a = do_find(a);
			int repr_b = do_find(b);

			if (repr_a == repr_b)
			{
				g << "DA\n";
			}
			else {
				g << "NU\n";
			}
		}
	}
}