Cod sursa(job #2024725)

Utilizator ruxandramateiMatei Ruxandra ruxandramatei Data 21 septembrie 2017 06:19:28
Problema Heapuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.63 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in("heapuri.in");
ofstream out("heapuri.out");

typedef struct nod{
    int val;
    nod * st, * dr;
}ARBORE;

ARBORE * radacina;
int n;
int valori[200001], nr;

void adaugare(int val){
    ARBORE * deAdaugat = new ARBORE;
    deAdaugat -> val = val;
    deAdaugat -> st = NULL;
    deAdaugat -> dr = NULL;
    if(radacina == NULL){
        radacina = deAdaugat;
    }
    else{
        ARBORE * parcurg = radacina;
        ARBORE * parinte = new ARBORE;
        while(parcurg != NULL){
            if(val < parcurg -> val){//st
                parinte = parcurg;
                parcurg = parcurg -> st;
            }else{//dr
                parinte = parcurg;
                parcurg = parcurg -> dr;
            }
        }
        if(val < parinte -> val){
            deAdaugat -> st = parinte -> st;
            parinte -> st = deAdaugat;
        }else{
            deAdaugat -> dr = parinte -> dr;
            parinte -> dr = deAdaugat;
        }

    }
}

void stergere(int val){
    ARBORE * parcurg = radacina;
    ARBORE * parinte = new ARBORE;
    while(parcurg != NULL){
        if(parcurg -> val > val){
            parinte = parcurg;
            parcurg = parcurg -> st;
        }else if(parcurg -> val < val){
            parinte = parcurg;
            parcurg = parcurg -> dr;
        }else if(parcurg -> val == val){
            bool ok = false;
            if(parcurg == radacina){
              ok = true;
            }
            if(parcurg -> dr == NULL){
                parinte -> st = parcurg -> st;
            }else if(parcurg -> st == NULL){
                parinte -> st = parcurg -> dr;
            }else{
                ARBORE * aux = parcurg -> dr;
                while(aux -> st!= NULL){
                    aux = aux -> st;
                }
                aux -> st = parcurg -> st;
                parinte -> st = parcurg -> dr;
                if(ok == true){
                  radacina = aux;
                }
            }
            delete(parcurg);
            break ;
        }
    }
}

void minim(){
    ARBORE * parcurg = radacina;
    while(parcurg -> st != NULL){
        parcurg = parcurg -> st;
    }
    out << parcurg -> val << '\n';
}

int main() {
    radacina = NULL;
    nr = 0;
    in >> n;
    for(int i = 1; i <= n; i++){
        int tip ;
        in >> tip;
        if(tip == 1){
            int val;
            in >> val;
            valori[++ nr] = val;
            adaugare(val);
        }else if(tip == 2){
            int val;
            in >> val;
            stergere(valori[val]);
        }else{
            minim();
        }
    }


    return 0;
}