Pagini recente » Cod sursa (job #1152053) | Cod sursa (job #1953600) | Cod sursa (job #961104) | Cod sursa (job #1343932) | Cod sursa (job #406680)
Cod sursa(job #406680)
#include <algorithm>
using namespace std;
#define DIM 100005
#define MAX 10005
char s[ MAX ];
int xXx, ind_xXx;
int N, A[ DIM ];
int cnt_s, max_lng, ant[ DIM ], ind[ DIM ], sol[ DIM ];
inline int c_bin( const int &val ) {
int mid, left, right;
left = 0;
right = max_lng;
while( left <= right ) {
mid = ( left + right ) / 2;
if( A[ ind[ mid ] ] < val && val <= A[ ind[ mid+1 ] ] )
return mid;
if( A[ ind[ mid ] ] < val )
left = mid+1;
else
right = mid-1;
}
return max_lng;
}
inline void print( const int &val ) {
if( ant[ val ] )
print( ant[ val ] );
printf( "%d ", A[ val ] );
}
inline void read( int &val ) {
while( !isdigit( s[ cnt_s ] ) )
if( ++cnt_s == MAX ) {
fread( s, 1, cnt_s, stdin );
cnt_s = 0;
}
val = 0;
while( isdigit( s[ cnt_s ] ) ) {
val = val*10 + s[ cnt_s ] - '0';
if( ++cnt_s == MAX ) {
fread( s, 1, MAX, stdin );
cnt_s = 0;
}
}
}
int main() {
freopen( "scmax.in", "r", stdin );
freopen( "scmax.out", "w", stdout );
int i, lng;
cnt_s = 0;
read( N );
for( i = 1; i <= N; ++i )
read( A[ i ] );
lng = 1;
ind[ 1 ] = 1;
sol[ 1 ] = 1;
for( i = 2; i <= N; ++i ) {
lng = c_bin( A[ i ] );
sol[ i ] = lng + 1;
ant[ i ] = ind[ lng ];
ind[ lng+1 ] = i;
max_lng = max( max_lng, lng+1 );
if( sol[ i ] > xXx ) {
xXx = sol[ i ];
ind_xXx = i;
}
}
printf( "%d\n", xXx );
print( ind_xXx );
return 0;
}