Pagini recente » Cod sursa (job #2371456) | Cod sursa (job #1478427) | Cod sursa (job #1555924) | Cod sursa (job #663037) | Cod sursa (job #1342378)
#include <cstdio>
#include <algorithm>
using namespace std;
#define IN_FILE "algsort.in"
#define OUT_FILE "algsort.out"
#define father( a ) a >> 1
#define left_s( a ) a << 1
#define right_s( a ) ( a << 1 ) + 1
#define MAX_N 500005
int h[ MAX_N ], H;
inline void down_h( int *h, const int &N, int k ) {
int fiu;
do {
fiu = 0;
if( left_s( k ) <= N ) {
fiu = left_s( k );
if( right_s( k ) <= N && h[ right_s( k ) ] < h[ left_s( k ) ] )
fiu = right_s( k );
if( h[ fiu ] >= h[ k ] )
fiu = 0;
}
if( fiu ) {
swap( h[ k ], h[ fiu ] );
k = fiu;
}
} while( fiu );
}
inline void up_h( int *h, const int &N, int k ) {
int key = h[ k ];
while( k > 1 && key < h[ father( k ) ] ) {
h[ k ] = h[ father( k ) ];
k = father( k );
}
h[ k ] = key;
}
inline void build_h( int *h, const int &N ) {
for( int i = N >> 1; i; --i )
down_h( h, N, i );
}
inline void del_h( int *h, int &N, const int &k ) {
h[ k ] = h[ N ];
--N;
if( k > 1 && h[ k ] < h[ father( k ) ] )
up_h( h, N, k );
else
down_h( h, N, k );
}
inline void ins_h( int *h, int &N, const int &k ) {
h[ ++N ] = k;
up_h( h, N, N );
}
int main( ) {
FILE *f;
int N, x;
f = fopen( IN_FILE, "r" );
fscanf( f, "%d", &N );
for( int i = 1; i <= N; ++i ) {
fscanf( f, "%d", &x );
ins_h( h, H, x );
}
fclose( f );
f = fopen( OUT_FILE, "w" );
do {
fprintf( f, "%d ", h[ 1 ] );
del_h( h, H, 1 );
} while( H );
fclose( f );
return 0;
}