Cod sursa(job #2818779)

Utilizator Paul281881818818181991919191881818Draghici Paul Paul281881818818181991919191881818 Data 16 decembrie 2021 20:53:27
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.76 kb
#include <fstream>
#define N 100001
using namespace std;
ifstream cin("disjoint.in");
ofstream cout("disjoint.out");
int f[N], sz[N];
int find(int x){
	int root = x;
	while(root != f[root]) root = f[root];
	while(x != f[x]){
		int aux = f[x];
		f[x] = root;
		x = aux;
	}
	return root;
}
void unite(int x, int y){
	int gr1 = find(x),
		gr2 = find(y);
	if(sz[gr1] < sz[gr2]){
		sz[gr2] += sz[gr1];
		f[gr1] = gr2;
	}
	else{
		sz[gr1] += sz[gr2];
		f[gr2] = gr1;
	}
}
int main(){
	int n, m;
	cin >> n >> m; //nr de multimi, nr de operatii
	for(int i=1; i<=n; i++)
	{
		f[i] = i;
		sz[i] = 1;
	}
	for(int i=1; i<=m; i++)
	{
		int op, x, y;
		cin >> op >> x >> y;
		if(op == 1){
			unite(x, y);
		}
		else{
			if(find(x) == find(y)) cout << "DA\n";
			else cout << "NU\n";
		}
	}
}