Pagini recente » Cod sursa (job #1211042) | Cod sursa (job #2291043) | Cod sursa (job #1127071) | Cod sursa (job #1347568) | Cod sursa (job #1637578)
#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 > 1) && 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 *= 2;
if (x + 1 <= l && A[h[x]] > A[h[x+1]]) x++;
}
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];
h[p] = h[l--];
int aux = down(p);
if (aux == p) up(p);
}