Pagini recente » Cod sursa (job #2305907) | Cod sursa (job #656273) | Cod sursa (job #274462) | Cod sursa (job #2459503) | Cod sursa (job #371022)
Cod sursa(job #371022)
#include <stdio.h>
#define N 200000
int heap[N];//element [pozitie heap]
int chr[N];//ordine cronologica[pozitie heap]
int vh;//varf heap
int poz[N];//pozitia in heap[ordine cronologica]
void up(int kh)
{int t;
while(kh>1&&heap[kh/2]>heap[kh])
{t=heap[kh]; heap[kh]=heap[kh/2]; heap[kh/2]=t;
poz[chr[kh]]=kh/2;
poz[chr[kh/2]]=kh;
t=chr[kh]; chr[kh]=chr[kh/2]; chr[kh/2]=t;
kh/=2;
}
}
void down(int kh)
{int min,kmin,t;
do
{min=heap[kh];
kmin=kh;
if(2*kh<=vh&&min>heap[2*kh])
{min=heap[2*kh];
kmin=2*kh;
}
if(2*kh+1<=vh&&min>heap[2*kh+1])
{min=heap[2*kh+1];
kmin=2*kh+1;
}
if(kmin!=kh)
{t=heap[kmin]; heap[kmin]=heap[kh]; heap[kh]=t;
poz[chr[kmin]]=kh;
poz[chr[kh]]=kmin;
t=chr[kmin]; chr[kmin]=chr[kh]; chr[kh]=t;
}
}
while(kmin!=kh);
}
int main ()
{freopen("heap.in","r",stdin);
freopen("heap.out","w",stdout);
int m,i,x,y,t,chronos=0;
scanf("%d",&m);
for (i=0;i<m;i++)
{scanf("%d",&x);
if(x==1)//insereaza
{scanf("%d",&y);
heap[++vh]=y;
chr[vh]=++chronos;
poz[chr[vh]]=vh;
up(vh);
}
else if(x==2) //sterge
{scanf("%d",&y);
heap[poz[y]]=heap[vh];
chr[poz[y]]=chr[vh];
poz[chr[vh]]=poz[y];
vh--;
t=poz[y];
poz[y]=0;
up(t);
down(t);
}
else
{printf("%d ",heap[1]);
}
}
return 0;
}