Cod sursa(job #998159)

Utilizator diac_paulPaul Diac diac_paul Data 15 septembrie 2013 22:40:55
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include <stdio.h>
#include <vector>
#define NMax 100005

using namespace std;

int n;
vector<int> v[NMax];
int p[NMax];

int i, a[NMax], np;
int find_(int x)
{
	np = 0;

	for (i = x; p[i] != i; i = p[i])
		a[np++] = i;
	
	for (int j = 0; j < np; j++)
		p[a[j]] = i;

	return i;
}

void union_(int x, int y)
{
	p[find_(x)] = y;
}

int main()
{
	freopen("disjoint.in", "r", stdin);
	freopen("disjoint.out", "w", stdout);

	int m;
	scanf("%d %d", &n, &m);

	for (int i = 1; i <= n; i++)
		p[i] = i;

	while (m--)
	{
		int x, y, t;
		scanf("%d %d %d", &t, &x, &y);

		if (t == 1)
		{
			union_(x, y);
		}
		else
		{
			if (find_(x) != find_(y))
				printf("NU\n");
			else
				printf("DA\n");
		}
	}

	return 0;
}