Pagini recente » Cod sursa (job #2276363) | Cod sursa (job #139647) | Cod sursa (job #846060) | Cod sursa (job #2524268) | Cod sursa (job #2397187)
#include <iostream>
#include <fstream>
using namespace std;
struct nod {
int value, height;
nod *left, *right;
};
void reuniune(nod **arbori, int x, int y) {
nod *first = arbori[x], *second=arbori[y];
if (arbori[x] -> height < arbori[y] -> height) {
while (1) {
if (arbori[x] -> value > arbori[y] -> value) {
if (arbori[x] -> left == NULL) {
arbori[x] -> left = new nod;
arbori[x] -> left = arbori[y];
arbori[x] -> height += arbori[y] -> height;
break;
} else {
arbori[x] = arbori[x] -> left;
}
} else {
if (arbori[x] -> right == NULL) {
arbori[x] -> right = new nod;
arbori[x] -> right = arbori[y];
arbori[x] -> height += arbori[y] -> height;
break;
} else {
arbori[x] = arbori[x] -> right;
}
}
}
} else {
while(1) {
if (arbori[y] -> value > arbori[x] -> value) {
if (arbori[y] -> left == NULL) {
arbori[y] -> left = new nod;
arbori[y] -> left = arbori[x];
arbori[y] -> height += arbori[x] -> height;
break;
} else {
arbori[y] = arbori[y] -> left;
}
} else {
if (arbori[y] -> right == NULL) {
arbori[y] -> right = new nod;
arbori[y] -> right = arbori[x];
arbori[y] -> height += arbori[x] -> height;
break;
} else {
arbori[y] = arbori[y] -> right;
}
}
}
}
arbori[x] = first;
arbori[y] = second;
}
bool intersectie(nod **arbori, int x, int y) {
nod *first = arbori[x], *second=arbori[y];
if (arbori[x] -> height > arbori[y] -> height) {
while(arbori[x]) {
if (arbori[x] -> value == arbori[y] -> value) {
arbori[x] = first;
arbori[y] = second;
return 1;
} else if (arbori[x] -> value > arbori[y] -> value) {
if (arbori[x] -> left == NULL) {
arbori[x] = first;
arbori[y] = second;
return 0;
} else {
arbori[x] = arbori[x] -> left;
}
} else {
if (arbori[x] -> right == NULL) {
arbori[x] = first;
arbori[y] = second;
return 0;
} else {
arbori[x] = arbori[x] -> right;
}
}
}
} else {
while(arbori[y]) {
if (arbori[y] -> value == arbori[x] -> value) {
arbori[x] = first;
arbori[y] = second;
return 1;
} else if (arbori[y] -> value > arbori[x] -> value) {
if (arbori[y] -> left == NULL) {
arbori[x] = first;
arbori[y] = second;
return 0;
} else {
arbori[y] = arbori[y] -> left;
}
} else {
if (arbori[y] -> right == NULL) {
arbori[x] = first;
arbori[y] = second;
return 0;
} else {
arbori[y] = arbori[y] -> right;
}
}
}
}
arbori[x] = first;
arbori[y] = second;
return 0;
}
int main()
{
ifstream f("disjoint.in");
ofstream g("disjoint.out");
int n, m, i;
f>>n>>m;
nod **arbori = new nod* [n];
for (i = 1; i <= n; i++) {
arbori[i] = new nod;
arbori[i] -> value = i;
arbori[i] -> height = 1;
arbori[i] -> left = arbori[i] -> right = NULL;
}
int cod, x, y;
for (i = 0; i < m; i++) {
f>>cod>>x>>y;
if (cod == 1) {
reuniune(arbori, x, y);
} else if (cod == 2) {
g<<((intersectie(arbori, x, y) ? "DA":"NU"))<<"\n";
}
}
return 0;
}