Pagini recente » Cod sursa (job #1078543) | Cod sursa (job #1373387) | Cod sursa (job #221045) | Cod sursa (job #744963) | Cod sursa (job #1856122)
#include <stdio.h>
#define MAX 200005
int N, K, poz[MAX], heap[MAX], v[MAX], nr;
void swap(int x, int y)
{
int a;
a = heap[x]; heap[x] = heap[y]; heap[y] = a;
}
void urc(int k)
{
if (k > 1)
if (v[ heap[k] ] < v[ heap[k / 2] ])
{
poz[ heap[k] ] = k / 2; poz[ heap[k / 2] ] = k;
swap(k, k / 2);
urc(k / 2);
}
}
void cobor(int k)
{
int min, st, dr;
st = 2 * k;
dr = st + 1;
min = k;
if (st <= K) {if (v[ heap[k] ] > v[ heap[st] ]) min = st;}
if (dr <= K) {if (v[ heap[min] ] > v[ heap[dr] ]) min = dr;}
poz[ heap[k] ] = min; poz[ heap[min] ] = k;
swap(k, min);
if (min != k) cobor(min);
}
void sterg(int k)
{
poz[ heap[k] ] = K; poz[ heap[K] ] = k;
swap(k, K);
K--;
cobor(k);
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
int i, op, x;
scanf("%d", &N);
for (i = 1; i <= N; i++)
{
scanf("%d",&op);
switch (op)
{
case 1:
{
scanf("%d", &v[++nr]);
K++;
heap[K] = nr; poz[nr] = K;
urc(K);
break;
}
case 2:
{
scanf("%d", &x);
sterg(poz[x]);
break;
}
case 3:
{
printf("%d\n",v[ heap[1] ]);
break;
}
}
}
return 0;
}