Pagini recente » Cod sursa (job #2571875) | Cod sursa (job #2694391) | Cod sursa (job #2577724) | Cod sursa (job #1653935) | Cod sursa (job #2330788)
/**
Paduri de multimi disjuncte
infoarena: https://infoarena.ro/problema/disjoint
10/20p ?
**/
#include <fstream>
const int Dim = 100001;
int n, m;
int code, x, y;
int t[Dim];
int h[Dim];
void Solve();
void Union(int r1, int r2);
int Find(int x);
int main()
{
Solve();
return 0;
}
void Solve()
{
std::ifstream fin("disjoint.in");
std::ofstream fout("disjoint.out");
fin >> n >> m;
for(int i = 1; i <= n; ++i)
t[i] = i;
for(int i = 1; i <= m; ++i)
{
fin >> code >> x >> y;
if (code == 1)
Union(x, y);
else
{
if (Find(x) == Find(y)) fout << "DA\n";
else fout << "NU\n";
}
}
fin.close();
fout.close();
}
void Union(int r1, int r2)
{
if (h[r1] > h[r2])
t[r2] = r1;
else
{
t[r1] = r2;
if (h[r1] == h[r2])
h[r2]++;
}
}
int Find(int v)
{
int r, y = v;
while ( y != t[y] )
y = t[y];
r = y;
while ( v != r ) // compresie
{
y = t[v];
t[v] = r;
v = y;
}
}