Pagini recente » Cod sursa (job #339389) | Cod sursa (job #2206122) | Cod sursa (job #2884213) | Cod sursa (job #943701) | Cod sursa (job #2650506)
#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 Set
{
int* graf;
Set(int alocare): graf(new int[alocare]()) {} // () dupa alocare dinamica cu "new" initializeaza elementele cu null.
~Set() {delete[] graf;}
inline int get(int element) // O(1)
{
return element;
}
int radacina(int element) // O(log(n)) / O(1)
{
std::vector<int> drum;
int rad = get(element);
while (graf[rad]) //
{ //
drum.push_back(rad); //
rad = graf[rad] - 1; //
} // Aici fac compresia drumului.
for (int varf: drum) //
{ //
graf[varf] = rad + 1; //
} //
return rad;
}
inline void uneste(int a, int b) // O(log(n))
{
graf[radacina(a)] = radacina(b) + 1;
}
};
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';
}
}