Cod sursa(job #1944176)

Utilizator vlcmodanModan Valentin vlcmodan Data 28 martie 2017 23:11:09
Problema Paduri de multimi disjuncte Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include<stdio.h>
#include<iostream>
#include<vector>

#define v_i vector<int>
#define v_ip int*
using namespace std;


int n, m;
int type, x, y;
int t[100010], r[100010];

void unify(v_ip t, v_ip r,int x,int y)
{
	
	if (r[x] < r[y])
	{
		t[x] = y;
	}
	else
	{
		t[y] = x;
	}

	if (r[x] == r[y])
	{
		r[x]++;
	}
	
	
}

int found(v_ip t, int x)
{
	
	int rad;

	for (rad = x; rad != t[rad]; rad = t[rad]);

	while (x != t[x])
	{
		int aux = t[x];
		t[x] = rad;
		x = aux;
	}

	return rad;

}



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

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

	////v_i t(100010);
	//v_i r(100010);

	

	for (int i = 1; i <= n; ++i)
	{
		t[i] = i;
		r[i] = 1;
	}

	for (int i = 1; i <= m; i++)
	{
		int tip;
		scanf("%d%d%d", &tip, &x, &y);

		if (tip == 1)
		{
			unify(t,r, x, y);
		}
		else
		{
			if (found(t, x) == found(t, y))
			{
				printf("DA\n");
			}
			else
			{
				printf("NU\n");
			}
		}
	}

	fclose(stdin);
	fclose(stdout);



	return 0;
}