Cod sursa(job #300344)

Utilizator snaked31Stanica Andrei snaked31 Data 7 aprilie 2009 13:15:22
Problema Paduri de multimi disjuncte Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <stdio.h>
#include <algorithm>
#include <set>

using namespace std;

#define nm 100010

struct ltstr
{
  bool operator()(const int s1, const int s2) const
    {
	    return s1 < s2;
	}
};


set <int, ltstr> S[nm], T;
int i, n, m, j, x, t, y, X, Y;

void read()

{
	scanf("%d %d ", &n, &m);
	for (i=1; i<=n; ++i)
	{
		S[i].insert(i);
	}
}


void solve()

{
	for (i=1; i<=m; ++i)
	{
		scanf("%d %d %d ", &t, &x, &y);
		if (t == 1)
		{
			for (j=1; j<=n; ++j)
			{
				if (S[j].find(x) != S[j].end())
				{
					X = j;
				}
				if (S[j].find(y) != S[j].end())
					Y = j;
			}
			T.clear();
			set_union(S[X].begin(), S[X].end(), S[Y].begin(), S[Y].end(), inserter(T, T.begin()) );
			S[X].clear();
			S[Y].clear();
			copy(T.begin(), T.end(), inserter(S[X], S[X].begin()) );
		}
		else
		{
			for (j=1; j<=n; ++j)
            {
				if (S[j].find(x) != S[j].end())
				{
					X = j;
				}
				if (S[j].find(y) != S[j].end())
					Y = j;
			}
			if (X == Y)
				printf("DA\n");
			else
				printf("NU\n");
		}
	}
}


void write()

{

}


int main()

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

	read();
	solve();
	write();

	return 0;
}