Cod sursa(job #668703)
// http://infoarena.ro/problema/disjoint
#include <fstream>
using namespace std;
const int MAXSIZE = 100001;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
int length,operations;
int father[MAXSIZE];
void join(int first,int second);
int findAndUpdate(int node);
int main()
{
in >> length >> operations;
int type,first,second;
for(int i=1;i<=operations;i++)
{
in >> type >> first >> second;
if(type == 1)
{
int a = findAndUpdate(first);
int b = findAndUpdate(second);
join(a,b);
}
else
{
for(int i=1;i<=length;i++)
out << father[i] << " ";
if(findAndUpdate(first) == findAndUpdate(second))
out << "DA\n";
else
out << "NU\n";
out << "\n";
}
}
return (0);
}
void join(int first,int second)
{
father[first] = second;
}
int findAndUpdate(int node)
{
if(!father[node])
return node;
else
{
father[node] = findAndUpdate(father[node]);
return father[node];
}
}