Pagini recente » Cod sursa (job #41819) | Monitorul de evaluare | Cod sursa (job #898404) | Cod sursa (job #1998102) | Cod sursa (job #3337149)
#include <stdio.h>
int d[100000], v[100000], prev[100000];
FILE *fin, *fout;
int cautBin( int st, int dr, int x ) {
int mj;
while ( st + 1 < dr ) {
mj = (st + dr) / 2;
if ( v[d[mj]] < x )
st = mj;
else
dr = mj;
}
return dr;
}
void write( int pos ) {
if ( pos != -1 ) {
write( prev[pos] );
fprintf( fout, "%d ", v[pos] );
}
}
int main() {
int n, i, pos, lmax = 0;
fin = fopen( "scmax.in", "r" );
fscanf( fin, "%d", &n );
for ( i = 0; i < n; i++ )
fscanf( fin, "%d", &v[i] );
fclose( fin );
for ( i = 0; i < n; i++ ) {
pos = cautBin( -1, lmax, v[i] );
d[pos] = i;
prev[i] = pos > 0 ? d[pos - 1] : -1;
if ( lmax == pos )
lmax++;
}
fout = fopen( "scmax.out", "w" );
fprintf( fout, "%d\n", lmax );
write( d[lmax - 1] );
fputc( '\n', fout );
fclose( fout );
return 0;
}