Cod sursa(job #2308886)

Utilizator KaryamKaryam Ahmad Karyam Data 27 decembrie 2018 22:11:41
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.98 kb
#include <bits/stdc++.h>
using namespace std;

FILE *fin = freopen("disjoint.in", "r", stdin);
FILE *fout = freopen("disjoint.out", "w", stdout);

const int nMax = 1e5+2;
int n, m;
int parent[nMax];
int height[nMax];

int find(int node) {
	while(parent[node] != node) {
		parent[node] = parent[parent[node]];
		node = parent[node];
	}
	return node;
}

void _union (int u, int v) {
	int ru = find(u);
	int rv = find(v);

	if (height[ru] < height[rv])
		parent[ru] = rv;
	else if (height[rv] < height[ru])
		parent[rv] = ru;
	else {
		parent[ru] = rv;
		height[rv]++;
	}
}

void _print(bool ok) {
	if (ok)
		printf("DA\n");
	else printf("NU\n");
}

void initialize(int n) {
	for (int i = 1; i <= n; ++ i)
		parent[i] = i;
}

int main() {
	scanf ("%d%d", &n, &m);
	initialize(n);
	for (; m > 0; --m) {
		int qType, a, b;
		scanf("%d%d%d", &qType, &a, &b);
		if (qType == 1)
			_union(a, b);
		else
		    _print(find(a) == find(b));
	}
	return 0;
}