Pagini recente » Cod sursa (job #3147541) | Cod sursa (job #910592) | Cod sursa (job #613787) | Cod sursa (job #3215783) | Cod sursa (job #1509560)
#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 [ MAX ] , backStep [ MAX ];
int find ( int left , int right , int pos )
{
//binary search value in bst[left..right)
while ( left + 1 < right )
{
mid = ( left + right ) / 2;
if ( value [ bst [ mid ] ] >= value [ pos ] )
right = mid;
else
left = mid;
}
if ( bst [ left ] == 0 || value [ bst [ left ] ] >= value [ pos ] )
left --;
return left;
}
void best ( int val , int pos )
{
//bst [ i ] = the smallest value that gives you a ascending substring of length i
int index = find ( 1 , Max , pos );
if ( bst [ index + 1 ] == 0 )
{
Max ++;
bst [ index + 1 ] = pos;
backStep [ pos ] = bst [ index ];
}
else
if ( value [ bst [ index + 1 ] ] > val )
{
backStep [ pos ] = bst [ index ];
bst [ index + 1 ] = pos;
}
}
void read()
{
fscanf ( f , "%d" , &N );
for ( i = 1 ; i <= N ; i ++ )
{
fscanf ( f , "%d" , &value [ i ] );
best ( value [ i ] , i );
}
}
void printt ( int index )
{
if ( index )
{
printt ( backStep [ index ] );
fprintf ( g , "%d " , value [ index ] );
}
}
void print()
{
fprintf ( g , "%d\n" , Max - 1 );
printt ( bst [ Max - 1 ] );
fprintf ( g , "\n" );
}
int main()
{
read();
print();
return 0;
}