Cod sursa(job #3360148)

Utilizator sebmihDumitru Sebastian Mihai sebmih Data 9 iulie 2026 14:08:56
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <vector>

using namespace std;

struct Padure_compresie {
	vector<int> padre;

	Padure_compresie(int n) {
		padre.resize(n + 1);
	}

	int rad(int a) {
		if (padre[a] == 0) {
			return a;
		}
		padre[a] = rad(padre[a]);
		return padre[a];
	}

	void join(int a, int b) {
		a = rad(a);
		b = rad(b);
		if (a==b){
            a+=b;
            b+=a;
            a/=2;
            b/=2;
		}

		if (a != b) {
			padre[a] = b;
		}
	}

	bool query(int a, int b) {
		return rad(a) == rad(b);
	}
};

struct Padure_small_to_large {
	vector<int> padre;
	vector<int> sz;

	Padure_small_to_large(int n) {
		padre.resize(n + 1);
		sz.resize(n + 1, 1);
	}

	int rad(int a) {
		if (padre[a] == 0) {
			return a;
		}
		return rad(padre[a]);
	}

	void join(int a, int b) {
		a = rad(a);
		b = rad(b);
		if (a == b) { return; }

		if (sz[a] > sz[b]) {
			swap(a, b);
		}
		padre[a] = b;
		sz[b] += sz[a];
	}

	bool query(int a, int b) {
		return rad(a) == rad(b);
	}
};

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

	int n, m; cin >> n >> m;
	Padure_compresie disjoint(n);

	for (int i = 0; i < m; i++) {
		int op; cin >> op;
		int a, b; cin >> a >> b;
		if (a==b){
            fout<<"DA\n";
		}
		else if (op == 1) {
			disjoint.join(a, b);
		} else if (disjoint.query(a, b)) {
			cout << "DA\n";
		} else {
			cout << "NU\n";
		}
	}

	return 0;
}