Pagini recente » Cod sursa (job #430310) | Cod sursa (job #437118) | Cod sursa (job #2903296) | Cod sursa (job #917315) | Cod sursa (job #1509551)
#include <cstdio>
#include <iomanip>
using namespace std;
FILE *f = fopen ( "scmax.in" , "r" ) , *g = fopen ( "scmax.out" , "w" );
const int MAX = 100005;
int i , N , mid , Max = 1 , bst [ MAX ] , solution [ MAX ] , value;
int find ( int left , int right , int value )
{
//binary search value in bst[left..right)
while ( left + 1 < right )
{
mid = ( left + right ) / 2;
if ( bst [ mid ] >= value )
right = mid;
else
left = mid;
}
if ( bst [ left ] == 0 || bst [ left ] >= value )
left --;
return left;
}
void best ( int value )
{
//bst [ i ] = the smallest value that gives you a ascending substring of length i
int index = find ( 1 , Max , value );
if ( bst [ index + 1 ] == 0 )
{
Max ++;
bst [ index + 1 ] = value;
}
else
bst [ index + 1 ] = min ( bst [ index + 1 ] , value );
}
void read()
{
fscanf ( f , "%d" , &N );
for ( i = 1 ; i <= N ; i ++ )
{
fscanf ( f , "%d" , &value );
best ( value );
}
}
void print()
{
fprintf ( g , "%d\n" , Max - 1 );
for ( i = 1 ; i < Max ; i ++ )
fprintf ( g , "%d " , bst [ i ] );
fprintf ( g , "\n" );
}
int main()
{
read();
print();
return 0;
}