Cod sursa(job #2985807)

Utilizator etohirseCristi Cretu etohirse Data 27 februarie 2023 09:18:40
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
#include <iostream>

using namespace std;

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

const int maxN = 100000;

int a[maxN + 1], n;
int L[maxN + 1];
int best[maxN + 1];
int t[maxN + 1];

int lmax, lg, k;

inline int cb(int x) {
  int lb = 0, rb = lg;
  
  while (lb <= rb) {
    int mb = lb + (rb - lb) / 2;
    
    if (a[L[mb]] < x && a[L[mb + 1]] >= x) {
      return mb;
    } else if (a[L[mb + 1]] < x) {
      lb = mb + 1;
    } else {
      rb = mb - 1;
    }
  }
  
  return lg;
}

void afis(int i) {
  if (t[i] > 0) afis(t[i]);
  fout << a[i] << ' ';
}

int main() {
  fin >> n;
  for (int i = 1; i <= n; ++i) {
    fin >> a[i];
  }

 L[1] = best[1] = 1;
 lg = 1;
 
 for (int i = 2; i <= n; ++i) {
   k = cb(a[i]);
   t[i] = L[k];
   best[i] = k + 1;
   L[k + 1] = i;
   
   lg = max(lg, k + 1);
 }
 
 k = 0;
 for (int i = 1; i <= n; ++i) {
   if (lmax < best[i]) {
     lmax = best[i], k = i;
   }
 }
 
 fout << lmax << '\n';
 afis(k);
}