Cod sursa(job #2333404)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 1 februarie 2019 00:15:38
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100005;
const int INF = 2000000000;

int N;
int a[NMAX];
int dp[NMAX];
int pre[NMAX];
int aux[NMAX];

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

  fin.close();
}

int BinaryS( int lf, int rg, int val )
{
  if( lf > rg ) return -INF;

  int mid = ( lf + rg ) / 2;

  if( a[ aux[mid] ] < val )
    return max( mid, BinaryS( mid + 1, rg, val ) );
  else
    return BinaryS( lf, mid - 1, val );
}

void PrintRev( int pos )
{
  if( pre[pos] > 0 ) PrintRev( pre[pos] );

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

void Do()
{
  a[0] = -INF;

  aux[0] = 0;
  for( int i = 1; i <= N; ++i )
    aux[i] = INF;

  int prev;
  int last = 0;

  for( int i = 1; i <= N; ++i )
  {
    prev = BinaryS( 0, last, a[i] );

    pre[i] = aux[prev];
    dp[i] = dp[ aux[prev] ] + 1;
    aux[ prev + 1 ] = i;
    last = max( last, prev + 1 );
  }

  int lg_max = 0, pos_max;

  for( int i = 1; i <= N; ++i )
    if( lg_max < dp[i] )
    {
      lg_max = dp[i];
      pos_max = i;
    }

  fout << lg_max << '\n';

  PrintRev( pos_max );
}

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

    return 0;
}