Pagini recente » Cod sursa (job #2664734) | Cod sursa (job #2780124) | Cod sursa (job #233803) | Cod sursa (job #1766573) | Cod sursa (job #1010850)
#include <cstdio>
#include <cassert>
#define MAX_N 100001
int v[MAX_N], len[MAX_N], pred[MAX_N];
void read( FILE *fin, int &n ) {
assert( fscanf( fin, "%d", &n ) == 1 );
for ( int i = 1; i <= n; ++i )
assert( fscanf( fin, "%d", &v[i] ) == 1 );
}
void write( FILE *fout, int i ) {
if ( i == 0 )
return;
write( fout, pred[i] );
fprintf( fout, "%d ", v[i] );
}
int binary_search( int x, int nr ) {
int i, pas = 1 << 16;
for ( i = 0; pas; pas >>= 1 )
if ( i + pas <= nr && v[len[i + pas]] < x )
i += pas;
return i + 1;
}
void solve( FILE *fout, int n ) {
int nr = 1;
len[1] = 1;
for ( int i = 2; i <= n; ++i ) {
int j = binary_search( v[i], nr );
if ( j == nr + 1 )
++nr;
len[j] = i;
if ( j != 1 )
pred[i] = len[j - 1];
else
pred[i] = 0;
}
fprintf( fout, "%d\n", nr );
write( fout, len[nr] );
}
int main() {
FILE *fin, *fout;
fin = fopen( "scmax.in", "r" );
int n;
read( fin, n );
fclose( fin );
fout = fopen( "scmax.out", "w" );
solve( fout, n );
fclose( fout );
}