Cod sursa(job #850702)
#include <fstream>
#define nmax 100003
using namespace std;
ifstream in("disjoint.in");
ofstream out("disjoint.out");
int arb[nmax];
int rang[nmax];
int find(int x){
int i,y;
for (i=x;arb[i]!=i;i=arb[i]);
//mergi pana gasesti un nod care pointeaza catre el ;
for (;arb[x]!=x;)
{
y=arb[x];
arb[x]=i;
x=y;
}
return i;
}
void unite( int x, int y){
if (rang[x]<rang[y]) arb[x]=y;
else arb[y]=x;
if (rang[x]==rang[y]) ++rang[x];
}
int main()
{ int n,m;
in>>n>>m;
for (int i=1;i<=n;i++)
{
rang[i]=1;//rangul fiecarui arbore initial este 1
arb[i]=i;//radacina fiecarui arbore este elementul insusi
}
for (int i=1;i<=m;i++)
{
int op,a,b;
in>>op>>a>>b;
if (op==1){
unite(find(a),find(b));
}else
{
if (op==2)
{
if (find(a)==find(b)) out<<"DA"<<"\n";
else out<<"NU"<<"\n";
}
}
}
return 0;
}