Pagini recente » Cod sursa (job #1183529) | Cod sursa (job #595535) | Cod sursa (job #1408966) | Cod sursa (job #224038) | Cod sursa (job #712571)
Cod sursa(job #712571)
#include<cstdio>
using namespace std;
int a[200005],dim_heap,v[200005],aux,lg;
void reconst_heap (int x)
{
int min;
if (2*x<=dim_heap && a[2*x]<a[x])
min=2*x;
else min=x;
if (2*x+1<=dim_heap && a[2*x+1]<a[min])
min=2*x+1;
if (min!=x)
{
aux=a[x];
a[x]=a[min];
a[min]=aux;
aux=v[x];
v[x]=v[min];
v[min]=aux;
reconst_heap(min);
}
}
void insert (int x)
{
dim_heap++;
int i=dim_heap;
while (i>1 && a[i/2]>x)
{
a[i]=a[i/2];
v[i/2]=i;
i/=2;
}
a[i]=x;
v[++lg]=i;
}
void del (int x)
{
a[x]=a[dim_heap];
dim_heap--;
if (x>1 && a[x]<a[x/2])
{
while (x>1 && a[x]<a[x/2])
{
aux=a[x];
a[x]=a[x/2];
a[x/2]=a[x];
aux=v[x];
v[x]=v[x/2];
v[x/2]=v[x];
x/=2;
}
}
else
reconst_heap(x);
}
int main ()
{
int i,tip,nr,x,ord;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&x);
for (i=1; i<=x; i++)
{
scanf("%d",&tip);
if (tip==1)
{
scanf("%d",&nr);
insert(nr);
}
if (tip==2)
{
scanf("%d",&ord);
del(v[ord]);
}
if (tip==3)
printf("%d\n",a[1]);
}
return 0;
}