Cod sursa(job #384640)

Utilizator laserbeamBalan Catalin laserbeam Data 20 ianuarie 2010 17:02:48
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
// Catalin Balan
// Wed Jan 20 16:36:42 EET 2010
// Infoarena - disjoint

#include <cstdio>
#include <cstdlib>

using namespace std;

#define	NMAX 100003
#define CHUNK 8192
#define max(a,b) (a>b?a:b)

#define FIN "disjoint.in"
#define FOUT "disjoint.out"

char g_buf[CHUNK];
int g_p=CHUNK-1;

inline int get(FILE *f)
{

	int x = 0;
	while (g_buf[g_p] < '0' || g_buf[g_p] > '9')
		if (++g_p == CHUNK) fread(g_buf,1,CHUNK,f), g_p=0;

	while (g_buf[g_p] >= '0' && g_buf[g_p] <= '9')
	{
		x = x*10 + g_buf[g_p]-'0';
		if (++g_p == CHUNK) fread(g_buf,1,CHUNK,f), g_p=0;
	}
	return x;
}

int parent[NMAX];
int height[NMAX];

int getRoot(int k)
{
	while (parent[k]!=k) k = parent[k];
	return k;
}

void merge(int x, int y)
{

	int px,py;
	px = getRoot(x);
	py = getRoot(y);
	int q,r;
	if (height[px] > height[py])
	{
		height[px] = max(height[px], height[py]+1);
		for (q = y; q != py;)
		{
			r = parent[q];
			parent[q] = px;
			q = r;
		}
		parent[py] = px;
	} else {

		height[py] = max(height[py], height[px]+1);
		for (q = x; q != px;)
		{
			r = parent[q];
			parent[q] = py;
			q = r;
		}
		parent[px] = py;
	}

}

bool querry(int x, int y)
{
	if (getRoot(x) == getRoot(y))
		return true;
	return false;
}

int main(int argv, char ** argc)
{
	FILE *f = fopen(FIN, "r");
	FILE *g = fopen(FOUT, "w");

	int n,m,x,y,type;
	n = get(f);
	m = get(f);
	for (int i = 1; i <= n; ++i) parent[i] = i;

	for (int run = 1; run <= m; ++run)
	{
		type = get(f);
		x = get(f);
		y = get(f);
		
		if (type == 1) merge(x,y);
		else
		{
			if (querry(x,y)) fprintf(g,"DA\n");
			else fprintf(g,"NU\n");
		}

	}
	


	fclose(f);
	fclose(g);
	return EXIT_SUCCESS;
}