Cod sursa(job #1509551)

Utilizator jimcarterJim Carter jimcarter Data 24 octombrie 2015 02:27:18
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#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;
}