Cod sursa(job #2031763)

Utilizator ReeeBontea Mihai Reee Data 3 octombrie 2017 19:27:51
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#define NMax 100005

using namespace std;

ofstream fout("scmax.out");

int v[NMax], N, p[NMax], L[NMax],best[NMax], nr;

void Citire()
{
    ifstream fin("scmax.in");
    fin >> N;
    for ( int i = 1 ; i <= N ; ++i )
        fin >> v[i];
    fin.close();
    L[0] = 0;
    L[1] = best[1] = 1;
    nr = 1;
}

void Afisare( int i )
{
    if ( p[i] > 0 )
        Afisare( p[i] );
    fout << v[i] << " ";
}

int Cautare( int x )
{
    int prim = 0;
    int ultim = nr;
    int mij = ( prim + ultim ) / 2;
    while ( prim <= ultim )
    {
        if ( v[L[mij]] < x && v[L[mij + 1]] >= x )
            return mij;
        else
            if ( v[L[mij + 1]] < x )
            {
                prim = mij + 1;
                mij = ( prim + ultim ) / 2;
            }
        else
        {
            ultim = mij - 1;
            mij = ( prim + ultim ) / 2;
        }
    }
    return nr;
}

int main()
{
    Citire();
    int poz;
    for ( int i = 2 ; i <= N ; ++i )
    {
        poz = Cautare( v[i] );
        p[i] = L[poz];
        best[i] = poz + 1;
        L[poz + 1] = i;
        if ( nr < poz + 1 )
            nr = poz + 1;
    }
    int maxim = 0;
    poz = 0;
    for ( int i = 1 ; i <= N ; ++i )
        if ( maxim <= best[i] )
        {
            maxim = best[i];
            poz = i;
        }
    fout << maxim << '\n';
    Afisare( poz );
    return 0;
}