Pagini recente » Cod sursa (job #2472426) | Cod sursa (job #1599551) | Cod sursa (job #2264315) | Cod sursa (job #2756558) | Cod sursa (job #1957149)
#include <iostream>
#include <fstream>
#define MaxN 200001
using namespace std;
ifstream fin("heapuri.in");
ofstream fout("heapuri.out");
int n, x, y, heap[MaxN], pos[MaxN], v[MaxN], nr = 0, k = 0;
void schimba(int node, int P) {
int aux = heap[P];
heap[P] = heap[node];
heap[node] = aux;
aux = pos[P];
pos[P] = pos[node];
pos[node] = aux;
}
void solve(int node) {
int P = node / 2;
while(v[heap[P]] > v[heap[node]] && P > 0) {
schimba(node, P);
node = P;
P = node / 2;
}
}
void sterge(int node) {
node = heap[pos[node]];
if(2 * node > nr) {
heap[node] = 0;
pos[node] = 0;
nr--;
return;
}
schimba(nr, node);
heap[nr] = 0;
pos[nr] = 0;
nr--;
while(true) {
int stanga = 2 * node;
int dreapta = stanga + 1;
if(stanga > nr)
break;
else if(dreapta > nr) {
if(v[heap[stanga]] < v[heap[node]]) {
schimba(stanga, node);
node = stanga;
}
break;
}
else if(v[heap[stanga]] < v[heap[dreapta]] && v[heap[stanga]] < v[heap[node]]) {
schimba(stanga, node);
node = stanga;
} else if(v[heap[stanga]] > v[heap[dreapta]] && v[heap[dreapta]] < v[heap[node]]){
schimba(dreapta, node);
node = dreapta;
}
}
}
int main()
{
fin>>n;
//heap[0] = -1;
//nr - nr elemente in heap
//k - numar elemente introduse
for(int i = 1; i <= n; i++) {
fin>>x;
if(x == 1) {
nr++; k++;
fin>>v[k];
pos[k] = nr;
heap[nr] = k;
solve(nr); // sau k
} else if(x == 2) {
fin>>y;
sterge(y);
} else {
fout<<v[heap[1]]<<'\n';
}
}
fin.close();
fout.close();
return 0;
}