Cod sursa(job #1472584)

Utilizator ArkinyStoica Alex Arkiny Data 17 august 2015 13:14:24
Problema Paduri de multimi disjuncte Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<iostream>
#include<fstream>
using namespace std;

ifstream in("disjoint.in");
ofstream out("disjoint.out");

#define MAX 100001

struct Node
{
	unsigned int data;
}A[MAX];

int N, M;

int Find(int e)
{
	if (A[e].data & 0XFFFFFF)
	{
		A[e].data = Find(A[e].data);
		return A[e].data;
	}
	else
		return e;

}

void Add(int x, int y)
{
	x = Find(x);
	y = Find(y);

	if (A[x].data & 0xFF000000 > A[y].data & 0xFF000000)
		A[y].data = (A[y].data & 0xFF000000) | x;
	else if (A[x].data & 0xFF000000 < A[y].data & 0xFF000000)
		A[x].data = (A[x].data & 0xFF000000) | y;
	else
	{
		A[x].data = (A[x].data & 0xFF000000) | y;
		A[y].data = (A[y].data & 0xFFFFFF) | (((A[y].data & 0xFF000000)>>24 +1)<<24);
	}

}

void operation(int e,int x,int y)
{
	switch (e)
	{
	case 1:
		Add(x, y);
		break;
	case 2:
		int e1, e2;
		e1 = Find(x);
		e2 = Find(y);
		if (e1 == e2)
			out << "DA\n";
		else
			out << "NU\n";
		break;
	}
}

int main()
{
	in >> N >> M;
	int op, x, y;
	for (int i = 1;i <= M;++i)
	{
		in >> op >> x >> y;
		operation(op, x, y);
	}

	in.close();
	out.close();
	return 0;
}