Pagini recente » Cod sursa (job #818976) | Cod sursa (job #2014505) | Cod sursa (job #1244041) | Cod sursa (job #1486875) | Cod sursa (job #936444)
Cod sursa(job #936444)
#include <cstdio>
#include <algorithm>
#include <cassert>
using namespace std;
const int DMAX = 200005;
int H[DMAX], l, X, CR[DMAX], IN[DMAX];
void heap_insert () {
int cnod = H[l], i = l;
while (H[i / 2] > cnod && i != 1)
H[i] = H[i / 2], swap (CR[IN[i]], CR[IN[i / 2]]), swap (IN[i], IN[i / 2]), i /= 2;
H[i] = cnod;
}
void heap_eject (int nod) {
int i = nod, cnod = H[nod]; bool k;
while (H[i / 2] > cnod && i != 1)
H[i] = H[i / 2], swap (CR[IN[i]], CR[IN[i / 2]]), swap (IN[i], IN[i / 2]), i /= 2;
while (k = (H[i * 2] < H[i] && i * 2 <= l) || H[i * 2 + 1] < H[i] && i * 2 + 1 <= l)
if(k)
H[i] = H[i * 2], swap (CR[IN[i]], CR[IN[i * 2]]), swap (IN[i], IN[i * 2]), i *= 2;
else
H[i] = H[i * 2 + 1], swap (CR[IN[i]], CR[IN[i * 2 + 1]]), swap (IN[i], IN[i * 2 + 1]), i = i * 2 + 1;
H[i] = cnod;
}
int main() {
freopen ("heapuri.in", "r", stdin); freopen ("heapuri.out", "w", stdout);
int N, C = 0, i = 0;
scanf ("%d", &N);
while (N--) {
scanf("%d", &C);
switch (C) {
case 1:
scanf ("%d", &X); H[++l] = X; CR[++i] = l; IN[l] = i; heap_insert(); break;
case 2:
scanf ("%d", &X); H[CR[X]] = H[l--]; heap_eject (CR[X]); break;
default:
printf ("%d\n", H[1]);
}
}
}