Cod sursa(job #514468)
# include <cstdio>
const char FIN[] = "scmax.in", FOU[] = "scmax.out" ;
const int MAX = 100005 ;
short best[MAX] ;
int V[MAX], A[MAX], B[MAX] ;
int N ;
void print ( int pos ) {
if ( B[pos] ) {
print ( B[pos] ) ;
}
printf ( "%d ", V[pos] ) ;
}
int b_search ( int val, int N ) {
int i, cnt ;
for ( cnt = 1; cnt << 1 <= N ; cnt <<= 1 ) ;
for ( i = 0; cnt; cnt >>= 1 ) {
if ( i + cnt <= N && V[ A[i + cnt] ] < val ) {
i += cnt ;
}
}
return i ;
}
int main ( void ) {
freopen ( FIN, "r", stdin ) ;
freopen ( FOU, "w", stdout ) ;
scanf ( "%d", &N ) ;
for ( int i = 1; i <= N; ++i ) {
scanf ( "%d", V + i ) ;
}
int max = 1, pmax = 1 ;
best[1] = A[1] = 1 ;
for ( int i = 2, bst = 1; i <= N; ++i ) {
int pos = b_search ( V[i], bst ) ;
B[i] = A[pos] ;
best[i] = ++pos ;
A[pos] = i ;
if ( bst < pos )
bst = pos ;
if ( max < best[i] ) {
max = best[i] ;
pmax = i ;
}
}
printf ( "%d\n", max ) ;
print ( pmax ) ;
}