Cod sursa(job #1448076)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 6 iunie 2015 01:31:11
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <cstdio>
#include <cassert>
#include <algorithm>
using namespace std;
#define _submit
#ifdef _submit
#define InFile "disjoint.in"
#define OtFile "disjoint.out"
#else
#define InFile "fis.in"
#define OtFile "fis.out"
#endif

#define MAXN 100010

int parinti[MAXN];
int H[MAXN];

void reuniune(int x, int y) {
	int mx = x, tx = x;
	while (parinti[mx] != -1)
		mx = parinti[mx];
	int my = y, ty = y;
	while (parinti[my] != -1)
		my = parinti[my];

	if (H[my] < H[mx]) {
		H[my] = H[mx];
		parinti[my] = mx;
		my = mx;
	}
	else if(H[mx] < H[my]) {
		H[mx] = H[my];
		parinti[mx] = my;
		mx = my;
	}
	else {
		H[mx]++;
		H[my]++;
		parinti[mx] = my;
		mx = my;
	}

	while (parinti[tx] != -1) {
		int aux = parinti[tx];
		parinti[tx] = mx;
		tx = aux;
	}
	while (parinti[ty] != -1) {
		int aux = parinti[ty];
		parinti[ty] = my;
		ty = aux;
	}
}

bool aresame(int x, int y) {
	int mx = x, tx = x;
	while (parinti[mx] != -1)
		mx = parinti[mx];
	while (parinti[tx] != -1) {
		int aux = parinti[tx];
		parinti[tx] = mx;
		tx = aux;
	}

	int my = y, ty = y;
	while (parinti[my] != -1)
		my = parinti[my];
	while (parinti[ty] != -1) {
		int aux = parinti[ty];
		parinti[ty] = my;
		ty = aux;
	}

	if (mx == my)
		return true;
	return false;
}

int main() {
	assert(freopen(InFile, "r", stdin));
	assert(freopen(OtFile, "w", stdout));
	int N, M;
	scanf("%d%d", &N, &M);
	memset(parinti, 0xFF, N * sizeof(int));
	memset(H, 0, N * sizeof(int));
	for (int i = 0; i < M; i++) {
		int op, a, b;
		scanf("%d%d%d", &op, &a, &b);
		if (op == 1)
			reuniune(a-1, b-1);
		else {
			bool answer = aresame(a-1, b-1);
			if (answer)
				printf("DA\n");
			else
				printf("NU\n");
		}
	}
	return 0;
}