Cod sursa(job #742449)
Program disjoint;
var tata,rang:array [1..100000] of longint;
i,j,op,n,m,x,y:longint;
fi,fo:text;
function radacina(x:longint):longint;
var r,aux:longint;
begin
r:=x;
while tata[r]<>r do r:=tata[r];
radacina:=r;
while tata[x]<>x do begin aux:=tata[x]; tata[x]:=r; x:=aux; end;
end;
procedure uneste(x,y:longint);
begin
if rang[x]>rang[y] then tata[y]:=x else tata[x]:=y;
if rang[x]=rang[y] then inc(rang[y]);
end;
begin
assign(fi,'disjoint.in');
assign(fo,'disjoint.out');
reset(fi); rewrite(fo); readln(fi,n,m);
for i:=1 to n do begin tata[i]:=i; rang[i]:=1; end;
for i:=1 to m do begin
readln(fi,op,x,y);
if op=1 then uneste(radacina(x),radacina(y))
else if radacina(x)=radacina(y) then writeln(fo,'DA')
else writeln(fo,'NU');
end;
close(fo);
end.