Cod sursa(job #1509560)

Utilizator jimcarterJim Carter jimcarter Data 24 octombrie 2015 03:14:56
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 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 [ 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;
}