Pagini recente » Cod sursa (job #3287617) | Cod sursa (job #501970) | Cod sursa (job #966616) | Cod sursa (job #120815) | Cod sursa (job #963698)
Cod sursa(job #963698)
#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 () {
bool k = 1;
int a = cr[b];
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;
}
while (k) {
k = 1;
if (h[a * 2] < h[a] && a * 2 <= s) {
swap (h[a * 2], h[a]);
swap (in[a * 2], in[a]);
swap (cr[in[a]], cr[in[a * 2]]);
a *= 2;continue;
}
if (h[a * 2 + 1] < h[a] && a * 2 + 1 <= s) {
swap (h[a * 2 + 1], h[a]);
swap (in[a * 2 + 1], in[a]);
swap (cr[in[a]], cr[in[a * 2 + 1]]);
a = a * 2 + 1;continue;
}
k = 0;
}
}
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]);
}
}
}