Cod sursa(job #633250)

Utilizator the_snyper06FMI - ALexandru Mihai the_snyper06 Data 13 noiembrie 2011 13:08:36
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<cstdio>
#include<vector>
#include<algorithm>

#define nMax 100001
#define Check() if (++pozitie == nMax){fread (buff, 1, nMax, stdin); pozitie = 0;}

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

void Citeste(int &x) {
	x = 0;
	
	while(buff[pozitie] < '0' || buff[pozitie] > '9') Check();
	while('0' <= buff[pozitie] && buff[pozitie] <= '9') {
		x = x * 10 + (buff[pozitie] - '0');
		Check();
	}
}

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);
	Citeste(n); Citeste(m);
	
	for(i = 1; i <= n; i++) {
		L[i].push_back(i);
		multime[i] = i;
	}
	
	for(i = 1; i <= m; i++) {
		Citeste(cod); Citeste(x); Citeste(y);
		
		if(cod == 1) Reuneste(x, y);
		else Afiseaza(x, y);
	}
	
	return 0;
}