Pagini recente » Cod sursa (job #1489441) | Cod sursa (job #2105883) | Cod sursa (job #2743305) | Cod sursa (job #198089) | Cod sursa (job #1292794)
#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,place=0,j;
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=++place;
poz[heap[l].ord]=l;
pos=l;
while(pos/2&&heap[pos].nr<heap[pos/2].nr)
{
if(heap[pos].nr>heap[pos+1].nr&&pos/2==(pos+1)/2&&pos<l)
{
poz[heap[pos/2].ord]=2*poz[heap[pos].ord]+1;
poz[heap[pos+1].ord]/=2;
aux=heap[pos+1];
heap[pos]=heap[pos/2];
heap[pos/2]=aux;
pos/=2;
}
else
{
poz[heap[pos/2].ord]*=2;
poz[heap[pos].ord]/=2;
aux=heap[pos];
heap[pos]=heap[pos/2];
heap[pos/2]=aux;
pos/=2;
}
}
}
if(op==2)
{
fscanf(in,"%d",&pos);
heap[poz[pos]]=heap[l];
if(heap[l].nr<heap[l-1].nr)heap[poz[pos]]=heap[l];
heap[l].nr=0;
heap[l].ord=0;
--l;
x=poz[pos];
while(x*2<=l&&(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)||heap[2*x+1].nr==0)
{
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);
/*for(j=1;j<=l;++j)fprintf(out,"%d ",heap[j].nr);
fprintf(out,"\n%d\n\n",op);*/
}
fclose(in);fclose(out);
return 0;
}