Pagini recente » Cod sursa (job #1481448) | Cod sursa (job #223969) | Cod sursa (job #615920) | Cod sursa (job #566359) | Cod sursa (job #1637666)
#include <stdio.h>
#include <algorithm>
#define N_MAX 200005
int cmd;
int A[N_MAX], n;
int h[N_MAX], l;
int pos[N_MAX];
void adauga(int);
void sterge(int);
int up(int);
int down(int);
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
scanf("%d", &cmd);
int com, e;
for (int i = 1; i <= cmd; ++i){
scanf("%d", &com);
switch (com){
case 1 :
scanf("%d", &e);
adauga(e);
break;
case 2 :
scanf("%d", &e);
sterge(e);
break;
case 3 :
printf("%d\n", A[h[1]]);
break;
}
}
return 0;
}
int up(int x){
int p = x;
while (p/2 && A[h[p]] < A[h[p/2]]){
std::swap(h[p], h[p/2]);
pos[h[p]] = p;
pos[h[p/2]] = p/2;
p /= 2;
}
return p;
}
int down(int x){
int p = 0;
while (p != x){
p = x;
if (x*2 <= l && A[h[x]] > A[h[x*2]]) x = p * 2;
if (x + 1 <= l && A[h[x]] > A[h[x+1]]) x = p * 2 + 1;
std::swap(h[p], h[x]);
pos[h[x]] = x;
pos[h[p]] = p;
}
return x;
}
void adauga(int elem){
A[++n] = elem;
h[++l] = n;
pos[h[l]] = l;
up(l);
}
void sterge(int x){
int p = pos[x];
A[x] = -1;
up(p);
pos[h[1]] = 0;
h[1] = h[l--];
pos[h[1]] = 1;
if (l > 1) down(1);
}