Cod sursa(job #572562)
#include <stdio.h>
using namespace std;
const int nmax = 100010;
int RG[nmax], TT[nmax];
void Unite(int a, int b)
{
if(RG[a] > RG[b])
TT[b] = a;
else TT[a] = b;
if(RG[a] == RG[b]) RG[b]++;
}
int find(int x)
{
int t = x, R;
while(x != TT[x])
x = TT[x];
while(t != TT[t])
{
R = TT[t];
TT[t] = x;
t = R;
}
return x;
}
void read()
{
freopen ("disjoint.in", "r", stdin);
freopen ("disjoint.out", "w", stdout);
int N, M, i, a, b, q;
scanf("%d %d", &N, &M);
for(i = 1; i <= N; i++)
RG[i] = 1, TT[i] = i;
while(M--)
{
scanf("%d %d %d", &q, &a, &b);
if(q == 1)
Unite(find(a), find(b));
else
{
if(find(a) == find(b))
printf("DA\n");
else printf("NU\n");
}
}
}
int main()
{
read();
return 0;
}