Cod sursa(job #755985)
#include<fstream>
#define nmax 100005
using namespace std;
int a[nmax],r[nmax],n,m;
int find(int x)
{
int i,y;
for(i=x; a[i]!=i; i=a[i]);
for(; a[x]!=x;)
{
y=a[x];
a[x]=i;
x=y;
}
return i;
}
void join(int x,int y)
{
if(r[x]>r[y])a[y]=x;
else a[x]=y;
if(r[x]==r[y])++r[y];
}
int main(void)
{
ifstream fin("disjoint.in");
ofstream fout("disjoint.out");
int i,x,y,cod;
fin>>n>>m;
for(i=1;i<=n;++i)
{
a[i]=i;
r[i]=1;
}
for(i=1;i<=m;++i)
{
fin>>cod>>x>>y;
if(cod==2){
if(find(x)==find(y))fout<<"DA\n"; else fout<<"NU\n";
}
else
join(find(x),find(y));
}
return 0;
}