Pagini recente » Sedinta 2009-03-02 | Cod sursa (job #231476) | Cod sursa (job #1611917) | Istoria paginii jc2015/runda-2 | Cod sursa (job #1613643)
#include <fstream>
using namespace std;
ifstream f ("disjoint.in");
ofstream g ("disjoint.out");
const int NMAX = 100000;
int n, m, t, x, y;
int father[NMAX], height[NMAX];
void read()
{
f >> n >> m;
}
void init()
{
for(int i = 1; i <=n; ++i)
{
//initial fiecare nod pointeaza catre el insusi
father[i] = i;
height[i] = i;
}
}
int root(int x)
{
if (father[x] == x) return x;
father[x] = root(father[x]);
return father[x];
}
void unite(int a, int b)
{
a = root(a);
b = root(b);
if (height[b] > height[a]) father[a] = b;
else father[b] = a;
if (height[a] == height[b]) height[a]++;
}
bool are_united(int a, int b)
{
return root(a) == root(b);
}
void solve()
{
for(int i = 1; i <= m; ++i)
{
f >> t >> x >> y;
if(t == 1) unite(x, y);
else
{
if(are_united(x, y))
g << "Da\n";
else
g << "Nu\n";
}
}
}
int main()
{
read();
init();
solve();
return 0;
}