Cod sursa(job #2397183)

Utilizator ZamfiAndreiZamfira Andrei ZamfiAndrei Data 4 aprilie 2019 11:27:37
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.77 kb
#include <iostream>
#include <fstream>
using namespace std;

struct nod {
    int value, height;
    nod *left, *right;
};

void reuniune(nod **arbori, int x, int y) {
    int *stop = NULL;
    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;
                }
            }
        }
    }
}

bool intersectie(nod **arbori, int x, int y) {
    if (arbori[x] -> height > arbori[y] -> height) {
        while(arbori[x]) {
            if (arbori[x] -> value == arbori[y] -> value) {
                return 1;
            } else if (arbori[x] -> value > arbori[y] -> value) {
                if (arbori[x] -> left == NULL) {
                    return 0;
                } else {
                    arbori[x] = arbori[x] -> left;
                }
            } else {
                if (arbori[x] -> right == NULL) {
                    return 0;
                } else {
                    arbori[x] = arbori[x] -> right;
                }
            }
        }
    } else {
        while(arbori[y]) {
            if (arbori[y] -> value == arbori[x] -> value) {
                return 1;
            } else if (arbori[y] -> value > arbori[x] -> value) {
                if (arbori[y] -> left == NULL) {
                    return 0;
                } else {
                    arbori[y] = arbori[y] -> left;
                }
            } else {
                if (arbori[y] -> right == NULL) {
                    return 0;
                } else {
                    arbori[y] = arbori[y] -> right;
                }
            }
        }
    }

    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;
}