Cod sursa(job #2340925)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 11 februarie 2019 11:50:16
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100002;
const int INF = 2000000000;

int N;
int a[NMAX];
int pre[NMAX];
int sub[NMAX];
int last;

void Read()
{
  fin >> N;

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

  fin.close();
}

int BinSearch( int lf, int rg, int val )
{
  if( lf > rg ) return 0;

  int mid = ( lf + rg ) / 2;

  if( val > a[ sub[mid] ] ) return max( mid, BinSearch( mid + 1, rg, val ) );
  else return BinSearch( lf, mid - 1, val );
}

void Remake( int idx )
{
  if( pre[idx] > 0 ) Remake( pre[idx] );

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

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

  sub[0] = 0;
  last = 0;

  for( int i = 1; i <= N; ++i )
  {
    if( a[i] > a[ sub[last] ] )
    {
       sub[ ++last ] = i;
       pre[i] = sub[last - 1];
    }
    else
    {
      int pos = BinSearch( 1, last, a[i] );

      pre[i] = sub[pos];
      sub[pos + 1] = i;
    }
  }

  fout << last << '\n';

  Remake( sub[last] );
}

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

    return 0;
}