Pagini recente » Cod sursa (job #29571) | Cod sursa (job #252882) | Cod sursa (job #705) | Cod sursa (job #2751161) | Cod sursa (job #177103)
Cod sursa(job #177103)
#include <stdio.h>
#include <stdlib.h>
#define NMAX 100001
#define FIN "scmax.in"
#define FOUT "scmax.out"
#define INFINIT 2000000001
int N, A[NMAX], V[NMAX], ST[NMAX], L;
FILE * fin, * fout;
int binary_search( int value )
{
int step = 1, i = 0;
while( step <= L ) step <<= 1;
while ( step )
{
if (i + step <= L && V[i+step] < value ) i += step;
step >>= 1;
}
i++;
if( i > L ) L++;
return i;
}
void Reconst( int i, int last, int L )
{
if( L )
{
if( ST[i] == L && A[i] < last )
{
Reconst( i - 1, A[i], L - 1);
fprintf( fout, "%d ", A[i]);
}
else
Reconst( i - 1, last, L );
}
}
int main()
{
int i;
fin = fopen( FIN, "r" );
fout = fopen( FOUT, "w" );
fscanf( fin, "%d", &N );
for( i = 1; i <= N; i++ )
fscanf( fin, "%d", A+i );
L = 1; V[1] = A[1]; ST[1] = 1;
for( i = 2; i <= N; i++ )
{
int t = binary_search( A[i] );
V[t] = A[i];
ST[i] = t;
}
fprintf( fout, "%d\n", L );
int last = INFINIT;
Reconst( N, last, L );
fprintf( fout, "\n" );
fclose( fin );
fclose( fout );
return 0;
}