Pagini recente » Cod sursa (job #289437) | Cod sursa (job #1426981) | Cod sursa (job #65925) | Cod sursa (job #371848) | Cod sursa (job #418611)
Cod sursa(job #418611)
//Maxheap
#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 max(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;
aj=max(poz,n);
if(2*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=nr;
ot[nrcrt]=nr;
urca(nr,nr);
}break;
case 2:{scanf("%d",&val);
h[ot[val]]=h[nr];
nr--;
coboara(ot[val],nr);
}break;
case 3:printf("%d\n",h[1].val);break;
}
}
return 0;
}