Pagini recente » Cod sursa (job #2000607) | Cod sursa (job #2569189) | Cod sursa (job #1761020) | Cod sursa (job #1892648) | Cod sursa (job #1420528)
// Paduri de multimi disjuncte - O(log*N) <=5
// op 1 - O(1) - reuneste multimile in care se afla x si y (din multimi diferite)
// op 2 - O(log*N) - sa se spuna daca x si y sunt in aceeasi mutlime
#include <fstream>
#define Nmax 100099
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int N,M,T[Nmax];
/* returneaza grupa din care face parte x
numele grupei este numele tatalui arborelui */
int gr(const int& x) {
if(T[x] != x) {
T[x] = gr(T[x]);
}
return T[x];
}
void reunion(const int& x, const int& y){
T[ gr(x) ] = gr(y);
}
int main()
{
f >>N >> M;
/* initializare - N multimi */
for(int i = 1; i <= N; ++i) T[i] = i;
for(int i = 1; i <= M; ++i)
{
int op,x,y;
f >> op >> x >> y;
if(op == 1) {
reunion(x,y);
continue;
}
if(op == 2) {
if(gr(x) == gr(y)) g<<"DA\n";
else g<<"NU\n";
}
}
f.close();g.close();
return 0;
}