Cod sursa(job #633035)

Utilizator the_snyper06FMI - ALexandru Mihai the_snyper06 Data 12 noiembrie 2011 20:02:22
Problema Paduri de multimi disjuncte Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;
int n, m;
vector <int>L[100001];
int multime[100001]; // multime[i] = indicele multimii in care se afla elementul i

void Reuneste(const int &x, const int &y) {
	int k;
	int i = multime[x]; // indicele multimii lui x
	int j = multime[y]; // indicele multimii lui y
	
	if(L[i].size() < L[j].size()) swap(i, j); // selectez lista cea mai scurta
	
	for(k = 0; k < (int)L[j].size(); k++) {
		L[i].push_back(L[j][k]);
		multime[L[j][k]] = i;
	}
}

void Afiseaza(const int &x, const int &y) {
	if(multime[x] == multime[y]) printf("DA\n");
	else printf("NU\n");
}

int main() {
	int i, x, y, cod;
	
	freopen("disjoint.in", "r", stdin), freopen("disjoint.out", "w", stdout);
	scanf("%d %d", &n, &m);
	
	for(i = 1; i <= n; i++) {
		L[i].push_back(i);
		multime[i] = i;
	}
	
	for(i = 1; i <= m; i++) {
		scanf("%d %d %d", &cod, &x, &y);
		
		if(cod == 1) Reuneste(x, y);
		else Afiseaza(x, y);
	}
	
	return 0;
}