Pagini recente » Cod sursa (job #2118582) | Cod sursa (job #2595593) | Borderou de evaluare (job #721569) | Cod sursa (job #2668439) | Cod sursa (job #239108)
Cod sursa(job #239108)
#include <stdio.h>
#include <vector>
int n, nr_h, nr_i, h [200005], a [200005], p [200005];
void up (int k)
{
int aux;
while (k >= 1 && a [h [k]] < a [h [k>>1]])
{
aux=h [k];
h [k]=h [k>>1];
h [k>>1]=aux;
p [h [k]]=k;
p [h [k>>1]]=k>>1;
k>>=1;
}
}
void down (int k)
{
int aux, f=k, min=a [h [k]];
if ((k << 1) <= nr_h && a [h [k<<1]] < min)
{
min=a [h [k<<1]];
f=k<<1;
}
if (((k << 1)|1) <= nr_h && a [h [(k<<1)|1]] < min)
{
min=a [h [(k<<1)|1]];
f=(k<<1)|1;
}
if (f == k)
return ;
aux=h [k];
h [k]=h [f];
h [f]=aux;
p [h [k]]=k;
p [h [f]]=f;
down (f);
}
int main ()
{
freopen ("heapuri.in", "r", stdin);
freopen ("heapuri.out", "w", stdout);
int i, tip, x;
scanf ("%d", &n);
for (i=1; i<=n; ++i)
{
scanf ("%d", &tip);
if (tip == 3)
printf ("%d\n", a [h [1]]);
else
{
scanf ("%d", &x);
if (tip == 1)
{
++nr_h; ++nr_i;
h [nr_h]=nr_i;
a [nr_i]=x;
p [nr_i]=nr_h;
up (nr_h);
}
else
{
h [p [x]]=h [nr_h];
--nr_h;
up (p [x]);
down (p [x]);
}
}
}
return 0;
}