Skip to content

Instantly share code, notes, and snippets.

@sinmaplewing
Created April 25, 2011 09:41
#include<stdio.h>
#include<stdlib.h>
int deap[1000005];
int length = 1;
int isMaxHeap( int position )
{
while( position > 3 )
position /= 2;
return (position == 3);
}
int maxPartner( int position )
{
/* maxPartner = position + 2^([lg(position)] - 1) */
if( position == 2 )
return 2;
int result = position, temp = 1;
while( position > 3 )
{
position /= 2;
temp *= 2;
}
result += temp;
if( result > length ) return result / 2;
return result;
}
int minPartner( int position )
{
/* minPartner = position - 2^([lg(position)] - 1) */
int result = position, temp = 1;
while( position > 3 )
{
position /= 2;
temp *= 2;
}
result -= temp;
return result;
}
void maxInsert( int position, int value )
{
int up = position/2, down = position;
while( down > 3 && deap[up] < value )
{
deap[down] = deap[up];
down = up;
up = down/2;
}
deap[down] = value;
}
void minInsert( int position, int value )
{
int up = position/2, down = position;
while( down > 2 && deap[up] > value )
{
deap[down] = deap[up];
down = up;
up = down/2;
}
deap[down] = value;
}
void insert( int value )
{
length++;
if( length == 2 )
{
deap[length] = value;
return;
}
else
{
int partner;
if( isMaxHeap(length) )
{
partner = minPartner( length );
if( value < deap[partner] )
{
deap[length] = deap[partner];
minInsert( partner, value );
}
else
maxInsert( length, value );
}
else
{
partner = maxPartner( length );
if( value > deap[partner] )
{
deap[length] = deap[partner];
maxInsert( partner, value );
}
else
minInsert( length, value );
}
}
}
int maxDelete()
{
int deap_max = deap[3];
int deap_last = deap[length--];
int i, j;
for( i = 3, j ; 2*i <= length ; i = j )
{
if( 2*i+1 <= length )
j = ( deap[2*i] > deap[2*i+1] )? 2*i : 2*i+1;
else
j = 2*i;
deap[i] = deap[j];
}
int partner = minPartner(i);
if( 2*partner <= length )
{
if( 2*partner+1 <= length && deap[2*partner] < deap[2*partner+1] )
partner = 2*partner+1;
else
partner = 2*partner;
}
if( deap_last < deap[partner] )
{
deap[i] = deap[partner];
minInsert( partner, deap_last );
}
else
maxInsert( i, deap_last );
return deap_max;
}
int minDelete()
{
int deap_min = deap[2];
int deap_last = deap[length--];
int i, j;
for( i = 2, j ; 2*i <= length ; i = j )
{
if( 2*i+1 <= length )
j = ( deap[2*i] < deap[2*i+1] )? 2*i : 2*i+1;
else
j = 2*i;
deap[i] = deap[j];
}
int partner = maxPartner(i);
if( deap_last > deap[partner] )
{
deap[i] = deap[partner];
maxInsert( partner, deap_last );
}
else
minInsert( i, deap_last );
return deap_min;
}
int main()
{
int control, value;
while( scanf( "%d", &control ) != EOF )
{
switch( control )
{
case 1:
scanf( "%d", &value );
insert(value);
break;
case 2:
if( length == 2 )
printf( "%d\n", minDelete() );
else
printf( "%d\n", maxDelete() );
break;
case 3:
printf( "%d\n", minDelete() );
break;
}
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment