Pagini recente » Cod sursa (job #2535606) | Cod sursa (job #379658) | Cod sursa (job #1400809) | Cod sursa (job #166160) | Cod sursa (job #1183495)
#include <stdio.h>
#define N_MAX 200000
int heap[ N_MAX ], point[ N_MAX ], point2[ N_MAX ], ind = 0;
void schimb ( int p1, int p2 ){
int aux = heap[ p1 ];
heap[ p1 ] = heap[ p2 ];
heap[ p2 ] = aux;
aux = point[ point2[ p1 ] ];
point[ point2[ p1 ] ] = point[ point2[ p2 ] ];
point[ point2[ p2 ] ] = aux;
aux = point2[ p1 ];
point2[ p1 ] = point2[ p2 ];
point2[ p2 ] = aux;
return ;
}
void urc ( int x ){
if ( x == 0 ) return ;
if ( heap[ x ] < heap[ ( x - 1 ) / 2 ] ){
schimb ( x, ( x - 1 ) / 2 );
urc ( ( x - 1 ) / 2 );
}
return ;
}
void cobor ( int x ){
if ( x == ind - 1 ) return ;
int a = 2 * x + 1, b = 2 * x + 2;
if ( b < ind ){
if ( heap[ b ] < heap[ a ] && heap[ b ] < heap[ x ] ){
schimb ( x, b );
cobor ( b );
}
else if ( heap[ a ] < heap[ x ] ){
schimb ( x, a );
cobor ( a );
}
}
else if ( a < ind ) if ( heap[ x ] > heap[ a ] ){
schimb ( x, a );
cobor ( a );
}
return ;
}
int main()
{
FILE *in = fopen ( "heapuri.in", "r" );
FILE *out = fopen ( "heapuri.out", "w" );
int n;
fscanf ( in, "%d", &n );
int i, tip, x, aux;
for ( i = 0; i < n; i++ ){
fscanf ( in, "%d", &tip );
if ( tip == 1 ){
fscanf ( in, "%d", &x );
heap[ ind ] = x;
point[ ind ] = ind;
point2[ ind ] = ind;
urc ( ind );
ind++;
}
else if ( tip == 2 ){
fscanf ( in, "%d", &x );
x--;
aux = point[ x ];
schimb ( aux, ind - 1 );
ind--;
if ( aux < ind ) cobor ( aux );
}
else fprintf ( out, "%d\n", heap[ 0 ] );
}
fclose ( in );
fclose ( out );
return 0;
}