Pagini recente » Cod sursa (job #1597622) | Cod sursa (job #1030393) | Cod sursa (job #1306816) | Cod sursa (job #2523110) | Cod sursa (job #418622)
Cod sursa(job #418622)
//Minheap
#include<stdio.h>
#define Nmax 200010
int vec[Nmax],n,nr,ot[Nmax],nrcrt;
struct heap
{
int val,crt;
}h[Nmax];
void urca(int poz,int n)
{
heap aj;
int aj2;
if(poz>1)
if(h[poz].val<h[poz/2].val)
{
aj=h[poz];
h[poz]=h[poz/2];
h[poz/2]=aj;
aj2=ot[h[poz].crt];
ot[h[poz].crt]=ot[h[poz/2].crt];
ot[h[poz/2].crt]=aj2;
urca(poz/2,n);
}
}
int min(int poz,int n)
{
if(2*poz+1<=n)
if(h[2*poz].val<h[2*poz+1].val)
return 2*poz;
else
return 2*poz+1;
else
return 2*poz;
}
void coboara(int poz,int n)
{
int aj,aj2;
heap z;
if(2*poz<=n)
{
aj=min(poz,n);
if(h[aj].val<h[poz].val)
{
z=h[aj];
h[aj]=h[poz];
h[poz]=z;
aj2=ot[h[aj].crt];
ot[h[aj].crt]=ot[h[poz].crt];
ot[h[poz].crt]=aj2;
coboara(aj,n);
}
}
}
int main()
{
int op,val;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&op);
switch(op)
{
case 1:{scanf("%d",&val);
nr++;
nrcrt++;
h[nr].val=val;
h[nr].crt=nrcrt;
ot[nrcrt]=nr;
urca(nr,nr);
}break;
case 2:{scanf("%d",&val);
h[ot[val]]=h[nr];
ot[h[nr].crt]=ot[val];
nr--;
coboara(ot[val],nr);
}break;
case 3:printf("%d\n",h[1].val);break;
}
}
return 0;
}