Pagini recente » Cod sursa (job #420164) | Istoria paginii utilizator/flavialice | Cod sursa (job #403996) | Profil Vlad_Cazac | Cod sursa (job #2212946)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("heapuri.in");
ofstream fout ("heapuri.out");
int n, m, v[200002], tip, x, t;
struct Heap{
int val, ord;
} h[200002];
void percolate (int k) {
Heap aux = h[k];
while (k > 1 && aux.val < h[k / 2].val) {
h[k] = h[k / 2];
v[h[k].ord] = k;
k = k / 2;
}
h[k] = aux;
v[h[k].ord] = k;
}
void baga_acolo (int x) {
h[++n].val = x;
h[n].ord = ++m;
v[m] = n;
percolate(n);
}
void sift (int k) {
int fiu = 0;
do {
fiu = 0;
if (2 * k <= n) {
fiu = 2 * k;
if (2 * k + 1 <= n && h[2 * k + 1].val < h[2 * k].val)
fiu = 2 * k + 1;
if (h[fiu].val >= h[k].val)
fiu = 0;
}
if (fiu) {
v[h[k].ord] = fiu;
v[h[fiu].ord] = k;
swap(h[k], h[fiu]);
k = fiu;
}
}while (fiu);
}
void scoate (int k){
h[k] = h[n];
v[h[k].ord] = k;
n--;
if (k > 1 && h[k].val < h[k / 2].val)
percolate(k);
else
sift(k);
}
int main()
{
fin >> t;
for (int i = 1; i <= t; i++) {
fin >> tip;
if (tip == 1) {
fin >> x;
baga_acolo(x);
}
else if (tip == 2) {
fin >> x;
scoate(v[x]);
}
else
fout << h[1].val << "\n";
}
return 0;
}