Cod sursa(job #2376640)

Utilizator davidbejenariu2David Bejenariu davidbejenariu2 Data 8 martie 2019 16:54:35
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>
#define N 100005
#define inf ( 1 << 30 )

using namespace std;

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

int n;
int a[N];

int best[N], last;
int prec[N];

void read()
{
    int i;

    fin >> n;

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

    fin.close();
}

int CB( int s, int d, int poz )
{
    if ( s > d ) return 0;

    int m = ( s + d ) / 2;

    if ( a[poz] > a[best[m]] )
        return max( m, CB( m + 1, d, poz ) );
    else return CB( s, m - 1, poz );
}

void out( int poz )
{
    if ( prec[poz] )
        out( prec[poz] );

    fout << a[poz] << ' ';
}

void solve()
{
    int i;

    a[0] = -inf;
    a[n+1] = inf;

    last = 0;
    best[last] = 0;

    for ( i = 1; i <= n; ++i )
         if ( a[i] > a[best[last]] )
         {
             best[++last] = i;
             prec[i] = best[last-1];

         }
         else
         {
             int poz = CB( 1, last, i );

             best[poz+1] = i;
             prec[i] = best[poz];
         }

    fout << last << '\n';

    out( best[last] );
}

int main()
{
    read();
    solve();

    fout.close();

    return 0;
}