Pagini recente » Cod sursa (job #2702824) | Cod sursa (job #1256256) | Cod sursa (job #222603) | Cod sursa (job #4560) | Cod sursa (job #1473629)
#include <stdio.h>
#define MAX 200005
typedef struct {
int v; //value
int n; //nth element added
} HType;
HType h[MAX];
int added[MAX], pos, add;
void swap (int x, int y) {
added[h[x].n] = y;
added[h[y].n] = x;
HType temp = h[x];
h[x] = h[y];
h[y] = temp;
}
void push (int x) {
int p = pos;
h[p].v = x;
h[p].n = add;
added[add] = p;
++add;
++pos;
while (p && h[(p-1)/2].v > h[p].v) {
swap((p-1)/2 , p);
p = (p-1)/2;
}
}
void pop (int x) {
--pos;
int aux = added[x];
swap(pos, added[x]);
x = aux;
int ok = 0;
do {
int minp = x;
if ((2*x+1) < pos && h[2*x+1].v < h[x].v) minp = 2*x+1;
if ((2*x+2) < pos && h[2*x+2].v < h[minp].v) minp = 2*x+2;
if (minp != x) {
swap(minp, x);
x = minp;
} else {
ok = 1;
}
} while (!ok);
int p = aux;
while (p && h[(p-1)/2].v > h[p].v) {
swap((p-1)/2 , p);
p = (p-1)/2;
}
}
int main (void) {
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
int code;
scanf("%d", &code);
if (code == 3) {
printf("%d\n", h[0].v);
} else {
int x;
scanf("%d", &x);
if (code == 1) {
push(x);
} else {
pop(x-1);
}
}
/*
printf("test: ");
for (int i = 0; i < pos; ++i) {
printf("%d ", h[i].v);
}
printf("\n");
*/
}
return 0;
}