Pagini recente » Cod sursa (job #2167528) | Cod sursa (job #3288807) | Cod sursa (job #3040597) | Cod sursa (job #1203395) | Cod sursa (job #898156)
Cod sursa(job #898156)
#include <cstdio>
using namespace std;
int A[200005], Heap[200005], Pos[200005], t, n;
template <class T> void swap ( T& a, T& b )
{
T c(a);
a=b;
b=c;
}
void up(int p)
{
while(p > 0 && A[Heap[p]] < A[Heap[(p-1)/2]]){
swap(Heap[p], Heap[(p-1)/2]);
Pos[Heap[p]] = p;
Pos[Heap[(p-1)/2]] = (p-1)/2;
p=(p-1)/2;
}
}
void down(int p)
{
int son;
while(son!=-1)
{
son = -1;
if((2*p+1) < n)
{
son=2*p+1;
if((2*p+2) < n && A[Heap[son]] > A[Heap[2*p+2]])
son = 2*p+2;
}
if(son != -1)
{
if(A[Heap[son]] < A[Heap[p]])
{
swap(Heap[son], Heap[p]);
Pos[Heap[son]] = son;
Pos[Heap[p]] = p;
p = son;
}
else
{
son = -1;
}
}
}
}
void insert(int x)
{
A[t] = x, Pos[t] = n, Heap[n] = t;
++t, ++n;
up(n-1);
}
void del(int x)
{
int pos = Pos[x];
A[x] = -1;
up(pos);
Heap[0] = Heap[n-1];
Pos[Heap[0]] = 0;
n--;
down(0);
}
int main()
{
freopen("heapuri.in", "r", stdin);
freopen("heapuri.out", "w", stdout);
int i, x, cod, N;
scanf("%d ", &N);
for (i=1; i<=N; i++)
{
scanf("%d ", &cod);
if (cod == 1)
{
scanf("%d", &x);
insert(x);
}
if (cod == 2)
{
scanf("%d", &x);
del(x-1);
}
if (cod == 3){
printf("%d\n", A[Heap[0]]);
}
}
return 0;
}