Cod sursa(job #3197575)

Utilizator vladimir.gavris.1Gavris Mihai Vladimir vladimir.gavris.1 Data 27 ianuarie 2024 10:14:08
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <stdio.h>

using namespace std;

#define MAXN 100000

int array[ MAXN ], solution[ MAXN ], v[ MAXN ];

int max_length = 0, n;

int bsearch( int value )
{
    int left, right, mid;
    left = -1;
    right = max_length;

    while( right - left > 1 )
    {
        mid = ( left + right ) / 2;
        if( solution[ mid ] < value )
        {
            left = mid;
        }
        else
        {
            right = mid;
        }
    }

    return right;
}

int main()
{
    FILE *fin, *fout;
    int i, element, maxx, last;
    fin = fopen( "scmax.in", "r" );
    fscanf( fin, "%d", &n );

    for( i = 0; i < n; i++ )
    {
        fscanf( fin, "%d", &array[ i ] );
        int a = bsearch( array[ i ] );
        v[ i ] = a;

        if( a == max_length )
        {
            last = i;
            max_length++;
        }
        solution[ a ] = array[ i ];
    }
    fclose( fin );

    fout = fopen( "scmax.out", "w" );
    fprintf( fout, "%d\n", max_length );

    solution[ max_length - 1 ] = array[ last ];
    maxx = array[ last ];

    int a = max_length - 2;
    last--;
    while( last >= 0 )
    {
        if( v[ last ] == a && array[ last ] < maxx )
        {
            solution[ a ] = array[ last ];
            maxx = array[ last ];
            a--;
        }
        last--;
    }

    for( i = 0; i < max_length; i++ )
    {
        fprintf( fout, "%d ", solution[ i ] );
    }
    fclose( fout );
    return 0;
}