Pagini recente » Cod sursa (job #1302024) | Cod sursa (job #2184927) | Cod sursa (job #1273489) | Cod sursa (job #1697789) | Cod sursa (job #1290464)
#include <cstdio>
using namespace std;
struct Heap
{
int nr,ord;
}heap[200001],aux;
int poz[200001];
int main()
{
FILE *in,*out;
in=fopen("heapuri.in","r");
out=fopen("heapuri.out","w");
int n,i,l=0,op,pos,a,x;
fscanf(in,"%d",&n);
for(i=1;i<=n;++i)
{
fscanf(in,"%d",&op);
if(op==1)
{
fscanf(in,"%d",&heap[++l].nr);
heap[l].ord=l;
poz[heap[l].ord]=l;
pos=l;
while(pos/2&&heap[pos].nr<heap[pos/2].nr)
{
poz[heap[pos].ord]/=2;
poz[heap[pos/2].ord]*=2;
aux=heap[pos];
heap[pos]=heap[pos/2];
heap[pos/2]=aux;
pos/=2;
}
}
if(op==2)
{
fscanf(in,"%d",&pos);
if(heap[l].nr<heap[l-1].nr)heap[poz[pos]]=heap[l];
else heap[poz[pos]]=heap[l-1];
heap[l].nr=0;
heap[l].ord=0;
poz[heap[l].nr]=0;
--l;
x=poz[pos];
while(pos<l/2&&(heap[x].nr>heap[x*2].nr||heap[x].nr>heap[x*2+1].nr))
{
if(heap[x*2].nr<heap[x*2+1].nr)
{
aux=heap[x*2];
pos*=2;
}
else
{
aux=heap[x*2+1];
pos=pos*2+1;
}
heap[pos]=heap[x];
heap[x]=aux;
a=poz[heap[x].ord];
poz[heap[x].ord]=poz[heap[pos].ord];
poz[heap[pos].ord]=a;
x=poz[pos];
}
}
if(op==3)fprintf(out,"%d\n",heap[1].nr);
}
fclose(in);fclose(out);
return 0;
}