Cod sursa(job #1850668)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 18 ianuarie 2017 20:22:45
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>

#define MAXN 100010

int parent[MAXN];

void setMark(int x, int mark) {
	while (parent[x] >= 0) {
		int bk = parent[x];
		parent[x] = mark;
		x = bk;
	}
}

int getMark(int x) {
	int cx = x;
	while (parent[x] >= 0)
		x = parent[x];
	setMark(cx, x);
	return x;
}

bool querey(int x, int y, bool unite = false) {
	int mx = getMark(x), my = getMark(y);
	if (mx == my) return false;
	if (!unite) return true;
	if (rand() & 1) parent[mx] = my;
	else parent[my] = mx;
	return true;
}

int main() {
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);
	srand(2351);
	int N, M;
	scanf("%d%d", &N, &M);
	memset(parent, 0xFF, sizeof(parent));
	for (int i = 0; i < M; ++i) {
		int o, a, b;
		scanf("%d%d%d", &o, &a, &b);
		--a, --b;
		if (o == 1)
			querey(a, b, true);
		else puts(querey(a, b) ? "NU" : "DA");
	}
	return 0;
}