Cod sursa(job #2246789)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 27 septembrie 2018 16:05:22
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <fstream>
#define maxn 100000

using namespace std;

int v[maxn+5];
int cap[maxn+5]; /// indice numar capat dreapta lungime sir []
int ult[maxn+5];

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

int cbin ( int _m, int val )
{
  int pas = 1, i = 1;
  while ( pas <= _m )
    pas *= 2;

  while ( pas > 0 )
  {
    if ( i + pas <= _m && v[cap[i+pas]] < val )
      i += pas;
    pas /= 2;
  }

  if ( i > 1 || v[cap[1]] < val )
    return i;
  return 0;
}

void subsir ( int p )
{
  if ( ult[p] != 0 )
    subsir ( ult[p] );
  fout << v[p] << ' ';
}

int main ()
{
  int n;

  fin >> n;

  int i;

  for ( i = 1; i <= n; i++ )
  {
    fin >> v[i];
    cap[i] = 2*1e9;
  }

  int _m = 1, j;

  cap[1] = 1;
  ult[1] = 1;
  for ( i = 2; i <= n; i++ )
  {
    j = cbin ( _m, v[i] );
    cap[j+1] = i;
    ult[i] = cap[j];
    if ( j == _m )
      _m++;
  }

  fout << _m << '\n';

  subsir ( cap[_m] );

  fin.close ();
  fout.close ();

  return 0;
}