Cod sursa(job #2300799)

Utilizator isav_costinVlad Costin Andrei isav_costin Data 12 decembrie 2018 00:25:44
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.88 kb
#include <cstdio>

#define MAXN 100000

using namespace std;

int v[MAXN+5], best[MAXN+5], p[MAXN+5], ans[MAXN+5];

/*
best[i] = pozitia celui mai mare element < v[i]
p[i] = pozitia in vectorul initial pentru al i-ulea element din sirul scmax
*/

int cb( int k, int m )
{
  int pas=(1<<16), i=1;

  while( pas )
  {
    if( i+pas<=m && v[p[i+pas]]<k )
      i+=pas;

    pas/=2;
  }

  return i;
}

int main()
{
  freopen( "scmax.in", "r", stdin );
  freopen( "scmax.out", "w", stdout );

  int n, l=1;

  scanf( "%d", &n );

  for( int i=1;i<=n;i++ )
  {
    scanf( "%d", &v[i] );

    int j=cb(v[i],l);

    best[i]=p[j];
    p[j+1]=i;

    l+=(l==j);
  }

  printf( "%d\n", l-1 );

  int j=p[l];

  for( int i=l-1;i>=1;i-- )
  {
    ans[i]=v[j];
    j=best[j];
  }

  for( int i=1;i<l;i++ )
    printf( "%d ", ans[i] );

  return 0;
}