Pagini recente » Cod sursa (job #1836388) | Cod sursa (job #464217) | Cod sursa (job #223190) | Cod sursa (job #1886272) | Cod sursa (job #964408)
Cod sursa(job #964408)
#include <cstdio>
#include <algorithm>
using namespace std;
const int DMAX = 200003;
int h[DMAX], s, c, cr[DMAX], b, in[DMAX];
void h_insert () {
int k = s;
while (h [k / 2] > h[k] && k != 1)
{
swap (h[k / 2], h[k]);
swap (in[k / 2], in[k]);
swap (cr[in[k]], cr[in[k / 2]]);
k /= 2;
}
}
void h_eject () {
int a = cr[b], son;
h[a] = h[s];
in[a] = in[s--];
while (h[a / 2] > h[a])
{
swap (h[a / 2], h[a]);
swap (in[a / 2], in[a]);
swap (cr[in[a]], cr[in[a / 2]]);
a /= 2;
}
do {
son = 0;
if (a * 2 <= s)
{
son = a * 2;
if (son + 1 <= s && h[son + 1] < h[son])
++son;
if (h[son] > h[a])
son = 0;
}
if (son)
swap (h[a], h[son]),
swap (in[a], in[son]),
swap (cr[in[a]], cr[in[son]]),
a = son;
} while (son);
}
int main () {
freopen ("heapuri.in", "r", stdin);
freopen ("heapuri.out", "w", stdout);
int N, a;
scanf ("%d", &N);
while (N--) {
scanf ("%d", &a);
switch (a) {
case 1: scanf ("%d", &b); h[++s] = b; cr[++c] = s, in[s] = c; h_insert (); break;
case 2: scanf ("%d", &b); h_eject (); break;
default: printf ("%d\n", h[1]);
}
}
}