Cod sursa(job #2021901)

Utilizator ReeeBontea Mihai Reee Data 14 septembrie 2017 21:55:10
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <fstream>
#define NMax 100003

using namespace std;

int n, v[NMax], best[NMax], p[NMax], k, L[NMax], nr;

ofstream fout("scmax.out");

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

int Cautare(int x)
{
    int prim, ultim, mij;
    prim = 0; ultim = nr; 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;
}

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

int main()
{
    Citire();
    int poz, maxim;
    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;
    }
    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;
}