Pagini recente » Cod sursa (job #667743) | Cod sursa (job #866413) | Cod sursa (job #1958084) | Cod sursa (job #979853) | Cod sursa (job #2793931)
#include <fstream>
using namespace std;
ifstream f("disjoint.in");
ofstream g("disjoint.out");
#define NMAX 100005
struct nod {
int tata, inaltime;
} noduri[NMAX];
int n, m;
void citire() {
f >> n >> m;
for (int i = 1; i <= n; ++i)
noduri[i] = {i, 1};
}
int parinte(int x) {
while (noduri[x].tata != x)
x = noduri[x].tata;
return x;
}
void reuniune(int x, int y) {
if (noduri[x].inaltime <= noduri[y].inaltime) {
noduri[x].tata = y;
noduri[y].inaltime = max(noduri[y].inaltime, noduri[x].inaltime + 1);
} else
noduri[y].tata = x;
}
void actualizare(int x, int parinte_x) {
int aux;
while (noduri[x].tata != x) {
aux = noduri[x].tata;
noduri[x].tata = parinte_x;
x = aux;
}
}
void rezolvare() {
int cod, x, y;
for (int i = 1; i <= m; ++i) {
f >> cod >> x >> y;
if (cod == 1)
reuniune(parinte(x), parinte(y));
else {
int parinte_x = parinte(x), parinte_y = parinte(y);
actualizare(x, parinte_x);
actualizare(y, parinte_y);
g << ((parinte_x == parinte_y) ? "DA" : "NU") << '\n';
}
}
}
int main() {
citire();
rezolvare();
return 0;
}