Cod sursa(job #2152745)

Utilizator AndreiBadescuBadescu Andrei-Octavian AndreiBadescu Data 5 martie 2018 19:30:47
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>

#define N 100001

using namespace std;

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

int n, pos, len, v[N], ind[N], pre[N];

inline int upperBound ( int x )
{
    int st, mij, dr;

    st = 1, dr = len + 1;
    while ( st < dr )
    {
        mij = (st + dr) / 2;

        if ( x > v[ ind[mij] ] )
            st = mij + 1;
        else
            dr = mij - 1;
    }

    return st;
}

void printSol ( int i );

int main()
{
    ios::sync_with_stdio (false);

    int i;

    fin >> n;

    for ( i = 1; i <= n; ++i )
        fin >> v[i];

    ind[1] = len = 1;

    for ( i = 2; i <= n; ++i )
    {
        pos = upperBound( v[i] );

        pre[i] = ind[pos-1];
        ind[pos] = i;

        if ( pos > len )
            len = pos;
    }

    fout << len << '\n';

    printSol ( ind[len] );
}

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