Cod sursa(job #1375285)

Utilizator Burbon13Burbon13 Burbon13 Data 5 martie 2015 12:54:19
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <cstdio>

#define n_max 100069

using namespace std;

int v[n_max],sol[n_max],l[n_max],n,k;

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

void dina()
{
    for ( int i = 1 ; i <= n ; i ++ )
        if ( v[i] > sol[k] )
        {
            sol[++k] = v[i] ;
            l[i] = k ;
        }
        else
        {
            int st = 1 , dr = k , m , pos = k ;
            while ( st <= dr )
            {
                m = st + ( dr - st ) / 2 ;
                if ( sol[m] < v[i] )
                    st = m + 1 ;
                else
                {
                    pos = m ;
                    dr = m - 1 ;
                }
            }
            sol[pos] = v[i] ;
            l[i] = pos ;
        }
    printf( "%d\n" , k ) ;
    int p = 0 ;
    for ( int i = n ; i > 0 && k ; i -- )
        if ( l[i] == k )
        {
            sol[++p] = v[i] ;
            k -- ;
        }
    for ( int i = p ; i > 0 ; i -- )
        printf( "%d " , sol[i] ) ;
}

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