Pagini recente » Cod sursa (job #1668575) | Cod sursa (job #2634612) | Cod sursa (job #2329980) | Cod sursa (job #520005) | Cod sursa (job #3243203)
#include <fstream>
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int sz = 0;
bool deleted[int(2e5) + 5];
struct elem{
int valoare;
int ordin;
};
elem heap[int(2e5) + 5];
void insert(elem nod){
heap[nod.ordin] = nod;
int poz = nod.ordin;
while (poz > 1 && heap[poz / 2].valoare >= nod.valoare){
swap(heap[poz / 2], heap[poz]);
poz /= 2;
}
}
void erase(){
swap(heap[1], heap[sz]);
heap[sz] = {0, 0};
sz--;
int poz = 1;
while (2 * poz <= sz){
if (heap[2 * poz].valoare && heap[2 * poz + 1].valoare){
if (heap[poz].valoare > heap[2 * poz].valoare || heap[poz].valoare > heap[2 * poz + 1].valoare){
if (heap[2 * poz].valoare <= heap[2 * poz + 1].valoare){
swap(heap[2 * poz], heap[poz]);
poz = 2 * poz;
} else {
swap(heap[2 * poz + 1], heap[poz]);
poz = 2 * poz + 1;
}
}
} else if (heap[2 * poz].valoare && heap[2 * poz].valoare < heap[poz].valoare){
swap(heap[poz], heap[2 * poz]);
poz = 2 * poz;
} else {
return;
}
}
return;
}
int main(){
int n;
fin >> n;
for (int i = 1; i <= n; i++){
elem nod;
int cod;
fin >> cod;
if (cod == 1){
sz++;
fin >> nod.valoare;
nod.ordin = sz;
insert(nod);
} else if (cod == 2){
int ordin;
fin >> ordin;
deleted[ordin] = true;
} else if (cod == 3){
while (deleted[heap[1].ordin] == true) {
erase();
}
fout << heap[1].valoare << '\n';
}
}
return 0;
}