Cod sursa(job #2637880)

Utilizator andreic06Andrei Calota andreic06 Data 25 iulie 2020 16:06:47
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include <fstream>

using namespace std;
const int N = 1e5;
int v[N+1], lis[N+1], true_parent[N+1];
int res[N+1];

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

int bs ( int x, int dr ) { /// cel mai mic v[lis[]] > x
   int st = 1, poz = -1;
   while ( st <= dr ) {
      int mid = st + ( dr - st ) / 2;
      if ( v[lis[mid]] >= x )
        dr = mid - 1, poz = mid;
      else
        st = mid + 1;
   }

   return poz;
}

int main()
{
   int n;
   in >> n;
   for ( int i = 1; i <= n; i ++ )
      in >> v[i];

   int k = 0;
   for ( int i = 1; i <= n; i ++ ) {
      if ( v[i] > v[lis[k]] )
        lis[++k] = i, true_parent[i] = lis[k-1];
      else {
        int change = bs ( v[i], k );
        true_parent[i] = lis[change-1];
        lis[change] = i;
      }
   }

   out << k << '\n';
   int original_value = lis[k];
   for ( int n_res = 1; n_res <= k; n_res ++ ) {
      res[n_res] = v[original_value];
      original_value = true_parent[original_value];
   }

   for ( int i = k; i; i -- )
      out << res[i] << ' ';
    return 0;
}