Pagini recente » Cod sursa (job #2275324) | Cod sursa (job #619431) | Cod sursa (job #214891) | Cod sursa (job #2940487) | Cod sursa (job #1405068)
#include<cstdio>
#include<algorithm>
using namespace std;
int cron[200001], heap[200001], poz_heap[200001];
int nr_elem, nr_heap;
int fiu_minim(int poz) {
int fiu = 0;
if (2*poz < nr_heap) {
fiu = 2*poz;
}
if (2*poz+1 < nr_heap && cron[heap[fiu]] > cron[heap[2*poz+1]]) {
fiu = 2*poz+1;
}
return fiu;
}
void sift(int poz) {
int fiu = fiu_minim(poz);
while (2*poz < nr_heap && cron[heap[fiu]] < cron[heap[poz]]) {
swap(heap[fiu], heap[poz]);
poz_heap[heap[fiu]] = fiu;
poz_heap[heap[poz]] = poz;
poz = fiu;
fiu = fiu_minim(poz);
}
}
void percolate(int poz) {
int parent = poz/2;
while (parent >= 1 && cron[heap[poz]] < cron[heap[parent]]) {
swap(heap[poz], heap[parent]);
poz_heap[heap[poz]] = poz;
poz_heap[heap[parent]] = parent;
poz = parent;
parent = poz/2;
}
}
void insereaza(int x) {
cron[nr_elem] = x;
heap[nr_heap] = nr_elem;
poz_heap[nr_elem] = nr_heap;
nr_elem++;
nr_heap++;
percolate(nr_heap-1);
}
void sterge(int poz) {
int ph = poz_heap[poz];
// pune ph pe ultima pozitie
swap(heap[ph], heap[nr_heap-1]);
poz_heap[heap[ph]] = ph;
nr_heap--;
percolate(ph);
sift(ph);
}
int main() {
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int n, tip, x, i;
nr_heap = 1;
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &tip);
if (tip == 1) {
scanf("%d", &x);
insereaza(x);
} else {
if (tip == 2) {
scanf("%d", &x);
sterge(x-1);
} else {
printf("%d\n", cron[heap[1]]);
}
}
}
return 0;
}