Pagini recente » Cod sursa (job #273541) | Cod sursa (job #2795968) | Cod sursa (job #1575296) | Cod sursa (job #2453634) | Cod sursa (job #979552)
Cod sursa(job #979552)
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 200003;
int H[NMAX * 2], V[NMAX], P[NMAX], le, s;
int _min (const int &a, const int &b) {
return V[H[a]] < V[H[b]] ? a : b;
}
void HEAP_sift (int x) {
int k = x * 2 + 1 <= le ? _min (x * 2, x * 2 + 1) : x * 2;
while (V[H[k]] < V[H[x]] && k <= le) {
swap (H[k], H[x]);
P[H[k]] = k;
P[H[x]] = x;
x = k;
k = k * 2 + 1 <= le ? _min (k * 2, k * 2 + 1) : k * 2;
}
}
void HEAP_percolate (int x) {
while (x / 2 && V[H[x]] < V[H[x / 2]]) {
swap (H[x], H[x / 2]);
P[H[x]] = x;
P[H[x / 2]] = x / 2;
x /= 2;
}
}
int main () {
freopen ("heapuri.in", "r", stdin);
freopen ("heapuri.out", "w", stdout);
int N, o, x;
scanf ("%d", &N);
while (N--) {
scanf ("%d", &o);
if (o == 1) {
scanf ("%d", &x);
V[++s] = x;
H[++le] = s;
P[s] = le;
HEAP_percolate (le);
continue;
}
if (o == 2) {
scanf ("%d", &x);
H[P[x]] = H[le--];
HEAP_sift (P[x]);
HEAP_percolate (P[x]);
continue;
}
printf ("%d\n", V[H[1]]);
}
}