Cod sursa(job #2530981)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 25 ianuarie 2020 15:37:59
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100005;

int N;
int a[NMAX];
int lg[NMAX];
int l[NMAX], nrl;
int pre[NMAX];

void Read()
{
    fin >> N;

    for( int i = 1; i <= N; ++i )
      fin >> a[i];
}

int LB( int lf, int rg, int val )
{
    if(lf > rg )
        return -1;

    int m=(lf + rg)/2;

    if( a[l[m]] < val )
        return max( m, LB(m+1, rg, val));
    else
        return LB(lf, m-1, val);
}

void Remake( int idx ) {
    if( idx == 0 ) return;

    Remake( pre[idx] );
    fout << a[idx] << ' ';
}

void Do()
{
    for( int i = 1; i <= N; ++i )
    {
       if( nrl == 0 || a[i] < a[ l[1] ] )
       {
          l[1] = i;

          if( nrl == 0 ) ++nrl;

          continue;
       }

       int p = LB( 1, nrl, a[i] );

       pre[i] = l[p];
       l[p + 1] = i;

       if( p == nrl ) ++nrl;
    }

    fout << nrl << '\n';
    Remake( l[nrl] );
}

int main()
{
    Read();
    Do();

    return 0;
}