Pagini recente » Cod sursa (job #1324246) | Cod sursa (job #2565725) | Cod sursa (job #1539047) | Cod sursa (job #1634042) | Cod sursa (job #1107892)
#include <iostream>
#include <cstdio>
#define nmax 1000005
using namespace std;
int n, m;
int inaltime[nmax], tata[nmax];
int radacina(int x)
{
int r, y;
for(r = x; r != tata[r]; r = tata[x]);
for(;tata[x] != x;)
{
y = tata[x];
tata[x] = r;
x = y;
}
return r;
}
void reunite(int x, int y)
{
if(inaltime[x] > inaltime[y])
tata[y] = x;
else
tata[x] = y;
if(inaltime[x] == inaltime[y])
inaltime[y]++;
}
int main()
{
freopen("disjoint.in", "r", stdin);
freopen("disjoint.out", "w", stdout);
scanf("%d %d\n", &n, &m);
for(int i = 1; i <= n; ++i)
{
tata[i] = i;
inaltime[i] = 1;
}
for(int x = 1; x <= m; ++x)
{
int tip, a, b;
scanf("%d %d %d", &tip, &a, &b);
if(tip == 2)
{
if(radacina(a) == radacina(b))
cout << "DA\n";
else
cout << "NU\n";
}
else
reunite(radacina(a), radacina(b));
}
return 0;
}