Pagini recente » Cod sursa (job #842722) | Cod sursa (job #3174058) | Cod sursa (job #1093659) | Cod sursa (job #780916) | Cod sursa (job #235663)
Cod sursa(job #235663)
#include<stdio.h>
#define N 200010
int n,i,j,cod,h[N],val,lh,poz1[N],cit,pcit,poz2[N];
void read_solve(),hu(int ic),hd(int ic,int nc),sw(int i1,int i2);
int main()
{
read_solve();
return 0;
}
void read_solve()
{
freopen("heapuri.in","rt",stdin);
freopen("heapuri.out","wt",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{ scanf("%d",&cod);
if(cod==3){printf("%d\n",h[1]);continue;}
if(cod==1){scanf("%d",&val);h[++lh]=val;poz1[++cit]=lh;poz2[lh]=cit;hu(lh);continue;}
scanf("%d",&pcit);
j=poz2[pcit];sw(j,lh);lh--;hu(j);hd(j,lh);
}
}
void sw(int i1,int i2)
{
int aux=h[i1];h[i1]=h[i2];h[i2]=aux;
aux=poz1[i1];poz1[i1]=poz1[i2];poz1[i2]=aux;
poz2[poz1[i1]]=i1;poz2[poz1[i2]]=i2;
}
void hu(int ic)
{
int is=ic>>1;
if(is&&h[is]>h[ic]){sw(is,ic);hu(is);}
}
void hd(int ic,int nc)
{
int is=ic<<1;
if(is>nc)return;
if(is<nc)if(h[is+1]<h[is])is++;
if(h[is]<h[ic]){sw(is,ic);hd(is,nc);}
}