Pagini recente » Cod sursa (job #684876) | Cod sursa (job #669892) | Cod sursa (job #2761196) | Cod sursa (job #1911412) | Cod sursa (job #2024725)
#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;
}