Cod sursa(job #2442390)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 23 iulie 2019 19:41:30
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <bits/stdc++.h>
#define NMAX 100000

using namespace std;

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

int v[NMAX + 1], best[NMAX + 1], L[NMAX + 1], pred[NMAX + 1], nr;

int cb( int x) {
  int st = 0;
  int dr = nr;
  while( st <= dr ) {
    int mid = (st + dr) / 2;
    if( v[L[mid]] <= x && x < v[L[mid + 1]] )
      return mid;
    else if( v[L[mid]] < x )
      st = mid + 1;
    else
      dr = mid - 1;
  }
  return nr;
}

void solve( int i ) {
  if( pred[i] == 0 ) {
    fout<<v[i]<<" ";
    return ;
  }
  solve(pred[i]);
  fout<<v[i]<<" ";
}

int main() {
    int n, i;
    fin>>n;
    for( i = 1; i <= n; i ++ )
      fin>>v[i];
    best[1] = L[1] = 1;
    L[0] = 0;
    nr = 1;
    int maxim = 0, poz;
    for( i = 2; i <= n; i ++ ) {
      int p = cb(v[i]);
      best[i] = p + 1;
      L[p + 1] = i;
      pred[i] = L[p];
      if( p + 1 > nr )
        nr = p + 1;
      if( maxim < best[i] )
        maxim = best[i], poz = i;
    }
    fout<<maxim<<"\n";
    solve(poz);
    return 0;
}