Pagini recente » Cod sursa (job #2826040) | Cod sursa (job #2406043) | Cod sursa (job #1694927) | Cod sursa (job #2274328) | Cod sursa (job #1878321)
#include <iostream>
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream f ("disjoint.in");
ofstream g ("disjoint.out");
int father[NMAX], rang[NMAX], n, m;
inline int max(int x, int y)
{
return x > y ? x : y;
}
inline int Father(int x)
{
while (father[x] != -1) x = father[x];
return x;
}
void Actualizare(int f, int x)
{
if (f == x) return;
Actualizare(f, father[x]);
father[x] = f;
}
void Write()
{
for (int i = 1; i <= n; i++)
cout<<father[i]<<' ';
cout<<'\n';
}
int main()
{
f>>n>>m;
for (int i = 1; i <= n; i++)
{
father[i] = -1; // radacina
rang[i] = 1;
}
for (int p, x, y, i = 1; i <= m; i++)
{
f>>p>>x>>y;
int f1 = Father(x);
int f2 = Father(y);
//Write();
if (p == 1) // actualizare
{
if (rang[f1] < rang[f2])
swap(f1, f2);
father[f2] = f1;
rang[f1] = max(rang[f1], rang[f2] + 1);
}
else // interogare
{
if (f1 == f2)
g<<"DA\n";
else g<<"NU\n";
Actualizare(f1, x);
Actualizare(f2, y);
}
}
return 0;
}