Pagini recente » Cod sursa (job #1640743) | Cod sursa (job #2014685) | Cod sursa (job #1762374) | Cod sursa (job #2009673) | Cod sursa (job #2025948)
#include <iostream>
#include <fstream>
#define DMAX 200001
using namespace std;
ifstream in("heapuri.in");
ofstream out("heapuri.out");
int nr;
int val[DMAX];//date de intrare
int n, arb[DMAX], n1;//n - nr de elem. puse in arborele arb
int corespVal[DMAX];
int pozInArb[DMAX];
inline int tataNod(int k){
return k / 2;
}
inline int fiuStanga(int k){
return k * 2;
}
inline int fiuDreapta(int k){
return k * 2 + 1;
}
//tatal unui nod trebuie sa fie mai mic decat toti fii sai
void validareSus(int k){
while((k > 1) && (corespVal[arb[tataNod(k)]] > corespVal[arb[k]])){
swap(arb[k],arb[tataNod(k)]);
swap(pozInArb[arb[k]],pozInArb[arb[tataNod(k)]]);
k = tataNod(k);
}
}
void inserare(int valoare){
corespVal[++ n1] = valoare;
arb[++ n] = n1;
pozInArb[n1] = n;
validareSus(n);
}
void validareJos(int k){
int fiu;// decid pe ce ramura ma duc
do{
fiu = 0;
if(fiuStanga(k) <= n){
fiu = fiuStanga(k);
if((k <= n/2) && (corespVal[arb[fiuStanga(k)]] > corespVal[arb[fiuDreapta(k)]])){
fiu = fiuDreapta(k);
}
if(arb[fiu] >= arb[k]){
fiu = 0;
}
}
if(fiu != 0){
swap(arb[k], arb[fiu]);
swap(pozInArb[arb[k]],pozInArb[arb[fiu]]);
k = fiu;
}
}while(fiu != 0);
}
void stergereArb(int k){
arb[k] = arb[n];
pozInArb[arb[n]] = k;
n--;
validareJos(k);
}
inline void minim(){
out << corespVal[arb[1]] << '\n';
}
void citire(){
int tip ;
in >> nr;
for(int i = 1; i <= nr; i++){
in >> tip;
if(tip == 1){
int x;
in >> x;
inserare(x);//ok
}else if(tip == 2){
int x;
in >> x;
stergereArb(pozInArb[x]);
}else{
minim();
}
}
}
int main(){
citire();
return 0;
}