Cod sursa(job #3359977)

Utilizator RaduBalasRadu Andrei Balas RaduBalas Data 7 iulie 2026 12:54:36
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <bits/stdc++.h>
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)
			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,i,op,a,b;
	cin >> n >> m;
	Padure_compresie disjoint(n);
	for(i=0; i<m; i++){
		cin >> op >> a >> b;
		if (op == 1)
			disjoint.join(a, b);
		else if (disjoint.query(a, b))
			cout << "DA\n";
		else
			cout << "NU\n";
	}
	return 0;
}