Cod sursa(job #633166)

Utilizator mihaibogdan10Mihai Bogdan mihaibogdan10 Data 13 noiembrie 2011 00:45:19
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>
#include<vector>
#define Check() if (++pozitie == 500005){fread (buff, 1, 500005, stdin); pozitie = 0;}
using namespace std;

vector <int> tata, rang;

int pozitie;
char buff[500005];

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

int Find(int x){
	if (tata[x] == x) return x;
		else{
			tata[x] = Find(tata[x]);
			return tata[x];
		}
}

void Merge (int &x, int &y){
	int xRoot = Find(x), yRoot = Find(y);
	if (xRoot == yRoot) return;
	
	(rang[xRoot] >= rang[yRoot]) ? tata[yRoot] = xRoot : tata[xRoot] = yRoot;
	if (rang[xRoot] = rang[yRoot]) rang[xRoot]++;
}

int main(){
	int n, m, i, tip, x, y;
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);
 
	Citeste(n); Citeste(m);
	
	for (i = 0; i <= n; i++) tata.push_back(i);
	rang.assign(n+1, 1);
	
	for (i = 1; i <= m; i++){
		Citeste(tip); Citeste(x); Citeste(y);
		if (tip == 1) Merge(x, y);
			else Find(y) == Find(x) ? printf("DA\n") : printf("NU\n");
	}
	return 0;
}