Cod sursa(job #1291744)

Utilizator Burbon13Burbon13 Burbon13 Data 13 decembrie 2014 10:49:50
Problema Subsir crescator maximal Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <iostream>
#include <cstdio>

#define n_max 100001

using namespace std;

int n , v[n_max] , L[n_max] , mrm = 0  ;

void citire() ;
void dinamica() ;

int main()
{
    freopen( "scmax.in" , "r" , stdin ) ;
    freopen( "scmax.out" , "w" , stdout ) ;
    citire() ;
    dinamica() ;
    return 0;
}

void citire()
{
    scanf( "%d" , &n ) ;
    for ( int i = 1 ; i <= n ; i ++ )
        scanf( "%d" , &v[i] ) ;
}

void dinamica()
{
    for ( int i = 1 ; i <= n ; i ++ )
    {
        int st = 1 , dr = mrm ;
        while ( st <= dr )
        {
            int m = st + ( dr - st ) / 2 ;
            if ( v[i] < v[L[m]] )
                dr = m - 1 ;
            else
                st = m + 1 ;
        }
        if ( st > mrm && v[i] > v[L[mrm]] )
            L[++mrm] = i ;
        else if ( v[L[st]] > v[i] )
            L[st] = i ;
    }
    printf( "%d\n" , mrm ) ;
    for ( int i = 1 ; i <= mrm ; i ++ )
        printf( "%d " , v[L[i]] ) ;
}