Pagini recente » Cod sursa (job #2114666) | Cod sursa (job #1333918) | Cod sursa (job #1243826) | Cod sursa (job #2189648) | Cod sursa (job #290656)
Cod sursa(job #290656)
#include <stdio.h>
#define N 200001
#define st(x) 2*(x)
#define dr(x) 2*(x)+1
#define tata(x) (x)/2
int heap[N],num[N],poz[N],vf=0;
void up(int k)
{int aux;
if(k>1&&num[heap[tata(k)]]>num[heap[k]])
{poz[heap[k]]=tata(k);
poz[heap[tata(k)]]=k;
aux=heap[tata(k)];
heap[tata(k)]=heap[k];
heap[k]=aux;
up(tata(k));
}
}
void down(int k)
{int min=k,aux;
if(st(k)<=vf&&num[heap[st(k)]]<num[heap[k]])
{min=st(k);}
if(dr(k)<=vf&&num[heap[dr(k)]]<num[heap[k]])
{min=dr(k);}
if(min!=k)
{aux=heap[k];
heap[k]=heap[min];
heap[min]=aux;
poz[heap[k]]=min;
poz[heap[min]]=k;
}
}
void solve(int k)
{
up(k);
down(k);
}
int main ()
{int n,cod,nr,i;
freopen("heapuri.in","r",stdin);
freopen("heapuri.out","w",stdout);
scanf("%d",&n);
for (vf=0,i=1;i<=n;i++)
{scanf("%d",&cod);
if(cod==1)
{scanf("%d",&nr);
vf++;
num[vf]=nr;
heap[vf]=vf;
poz[vf]=vf;
up(vf);
}
if(cod==2)
{scanf("%d",&nr);
heap[poz[nr]]=heap[vf];
vf--;
solve(vf);
}
if(cod==3)
{printf("%d\n",num[heap[1]]);
}
}
return 0;
}