Pagini recente » Istoria paginii utilizator/troleibuzulsa | Rating Sebestin Dragos (DrakeDemon) | Rating Maria Ioana (abracadabra22) | Cod sursa (job #146589) | Cod sursa (job #267400)
Cod sursa(job #267400)
// (min-)Heapuri
#include <cstdio>
int a[200100],p[200100],h[200100],dim=0,cnt=0;
void swap ( int i, int j)
{
int aux= h[i];
h[i]= h[j];
h[j]= aux;
p[h[i]]=i;
p[h[j]]=j;
}
void down ( int i)
{
int l,r,min;
l = 2*i ;
r = 2*i +1 ;
if ( l<= dim && a[h[l]]< a[h[i]] )
min= l;
else min= i;
if ( r<= dim && a[h[r]]< a[h[min]] )
min= r;
if ( min!= i )
{
swap (i,min);
down (min);
}
}
void up ( int i)
{
if (i>1 && a[h[i]] < a[h[i/2]] )
{
swap (i,i/2);;
up(i/2);
}
}
void insert ( int k)
{
++dim;
h[dim]=k;
p[k]=dim;
up(dim);
}
void cut (int k)
{
a[k]=0;
up (p[k]);
h[1]=h[dim]; --dim;
p[h[1]]=1;
down(1);
}
int main()
{
freopen ("heapuri.in","r",stdin);
freopen ("heapuri.out","w",stdout);
int N, i, option,k;
scanf("%d", &N);
for( i= 1; i<= N; ++i)
{
scanf("%d", &option);
switch (option )
{
case 1:{
scanf("%d", &k);
a[++cnt]= k;
insert (cnt);
break;
}
case 2:{
scanf("%d", &k);
cut (k);
break;
}
case 3:{
printf("%d\n", a[h[1]] );
break;
}
}
}
fclose(stdout);
return 0;
}