Cod sursa(job #796791)
#include <fstream>
using namespace std;
ifstream F("disjoint.in");
ofstream G("disjoint.out");
const int Nmax = 100010;
int Gr[Nmax],H[Nmax],N,M;
int Comp(int x)
{
int R, y;
for ( R = x; Gr[R] != R; R = Gr[R] );
for ( ; Gr[x] != x ; )
{
y = Gr[x];
Gr[x] = R;
x = y;
}
return R;
}
void Unite(int a,int b)
{
if( H[a] < H[b])
Gr[b] = a;
else
Gr[a] = b;
if (H[a] == H[b])
++H[b];
}
int main()
{
F>>N>>M;
for (int i=1;i<=N;++i)
Gr[i]=i , H[i]=1;
while ( M-- )
{
int type,a,b;
F>>type>>a>>b;
if (type == 1)
Unite(Comp(a),Comp(b));
else
G<<( Comp(a)==Comp(b) ?"DA":"NU" )<<endl;
}
F.close();
G.close();
return 0;
}