Pagini recente » Cod sursa (job #2899576) | Cod sursa (job #767510) | Cod sursa (job #597436) | Cod sursa (job #1314105) | Cod sursa (job #276330)
Cod sursa(job #276330)
#include<stdio.h>
#define Nmax 201000
#define inf 2000000000
int n,nr,sf,poz[Nmax];
struct heap
{
int val,crt;
}h[Nmax];
int minim(int x)
{
int min=0;
for(int i=0;i<2;i++)
if(h[x+i].val<h[min].val && h[x+i].val<h[x/2].val && x+i<=nr)
{
min=x+i;
}
return min;
}
void coboara(int k)
{
int min,z,gasit=1;
//min=minim(k*2);
while(gasit)
{
gasit=0;
min=minim(k*2);
if(min!=0)
{
z=h[k].val;
h[k].val=h[min].val;
h[min].val=z;
z=h[k].crt;
h[k].crt=h[min].crt;
h[min].crt=z;
z=poz[h[k].crt];
poz[h[k].crt]=poz[h[min].crt];
poz[h[min].crt]=z;
gasit=1;
k=min;
}
}
}
void urca(int k)
{
int z;
while(h[k].val<h[k/2].val && k>1)
{
z=h[k].val;
h[k].val=h[k/2].val;
h[k/2].val=z;
z=h[k].crt;
h[k].crt=h[k/2].crt;
h[k/2].crt=z;
z=poz[h[k].crt];
poz[h[k].crt]=poz[h[k/2].crt];
poz[h[k/2].crt]=z;
k=k/2;
}
}
int main()
{
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
h[0].val=inf;
int i,op,x;
for(i=1;i<=n;i++)
{ scanf("%d",&op);
if(op!=3)
scanf("%d",&x);
if(op==1)
{ nr++;
sf++;
h[nr].val=x;
h[nr].crt=sf;
poz[sf]=nr;
urca(nr);
}
if(op==2)
{ h[poz[x]].val=h[nr].val;
h[poz[x]].crt=h[nr].crt;
poz[h[nr].crt]=poz[x];
nr--;
coboara(poz[x]);
}
if(op==3)
printf("%d\n",h[1].val);
}
fclose(stdin);
fclose(stdout);
return 0;
}