Pagini recente » Cod sursa (job #2354009) | Cod sursa (job #2979805) | Cod sursa (job #2269281) | Cod sursa (job #1842732) | Cod sursa (job #2650401)
#define fisier "disjoint"
#ifdef fisier
#include <fstream>
std::ifstream in(fisier ".in");
std::ofstream out(fisier ".out");
#else
#include <iostream>
#define in std::cin
#define out std::cout
#endif
const int
N = 100000,
M = N;
int n;
#include <vector>
struct Varf {Varf* tata;};
struct Set
{
Varf* graf;
Set(int alocare): graf(new Varf[alocare]()) {} // () dupa alocare dinamica cu "new" initializeaza elementele cu null.
~Set() {delete[] graf;}
inline Varf* get(int element)
{
return graf + element;
}
Varf* radacina(int element)
{
std::vector<Varf*> drum;
Varf* rad = get(element);
while (rad->tata) //
{ //
drum.push_back(rad); //
rad = rad->tata; //
} // Aici fac compresia drumului.
for (Varf* varf: drum) //
{ //
varf->tata = rad; //
} //
return rad;
}
void uneste(int a, int b)
{
radacina(a)->tata = radacina(b);
}
};
int main()
{
int m;
in >> n >> m;
Set set = n;
while (m--)
{
int op, a, b;
in >> op >> a >> b;
a--, b--;
if (op & 1)
set.uneste(a, b);
else
out << (set.radacina(a) == set.radacina(b)? "DA": "NU") << '\n';
}
}