Cod sursa(job #1368643)

Utilizator gedicaAlpaca Gedit gedica Data 2 martie 2015 19:01:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>

using namespace std;

const int NMAX= 100000;

ifstream in ( "scmax.in" );
ofstream out( "scmax.out" );

int v[NMAX+1], d[NMAX+1], r[NMAX+1], ans[NMAX+1];
int k, maxim, poz, N, nr;

int find_sol( int x )
{
    int l= 0, r= nr, mid= ( l+r )/2;

    while( l <= r )
    {
        if ( v[ ans[mid] ] < x &&  v[ ans[mid+1] ] >= x )
        {
            return mid;
        }
        else if ( v[ ans[mid+1] ] < x )
        {
            l = mid + 1;
            mid = ( l + r )/2;
        }
        else
        {
            r = mid - 1;
            mid = ( l + r )/2;
        }
    }
    return nr;
}

void get_sol( int x )
{
    if( r[x] > 0 )  get_sol( r[x] );
    out << v[x] << ' ';
}

int main()
{
    in >> N;

    for( int i= 1; i <= N; ++i )
    {
        in >> v[i];
    }

    d[1] = ans[1] = 1;
    ans[0] =  0;
    nr = 1;

    for( int i= 2; i <= N; ++i )
    {
        poz = find_sol( v[i] );

        r[i] = ans[poz];
        d[i] = poz + 1;
        ans[poz + 1] = i;

        if( nr < poz + 1 )
        {
            nr= poz + 1;
        }
    }

    for( int i= 1; i<= N; ++i ){
        if( maxim < d[i] )
        {
            maxim = d[i];
            poz = i;
        }
    }

    out << maxim << '\n';
    get_sol(poz);

    return 0;
}