Cod sursa(job #2854017)

Utilizator vladburacBurac Vlad vladburac Data 20 februarie 2022 20:30:52
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
const int MAXN = 1e5;
const int INF = 2e9 + 1;

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

int v[MAXN+1], last[MAXN+1], prevInd[MAXN+1];
int sol[MAXN+1];
int main() {
  int n, i, st, dr, length, mij, k;
  fin >> n;
  for( i = 0; i < n; i++ )
    fin >> v[i];
  for( i = 0; i < n; i++ )
    prevInd[i] = -1;
  length = 1;
  for( i = 1; i < n; i++ ) {
    if( v[i] < v[last[0]] )
      last[0] = i;
    else if( v[i] > v[last[length-1]] ) {
      prevInd[i] = last[length-1];
      last[length++] = i;
    }
    else {
      st = 0;
      dr = length;
      while( dr - st > 1 ) {
        mij = ( st + dr ) / 2;
        if( v[last[mij]] > v[i] )
          dr = mij;
        else
          st = mij;
      }
      if( v[last[st]] < v[i] )
        st++;
      if( v[last[st]] != v[i] ) {
        prevInd[i] = last[st-1];
        last[st] = i;
      }
    }
  }
  fout << length << "\n";
  k = 0;
  for( i = last[length-1]; i >= 0; i = prevInd[i] )
    sol[k++] = v[i];
  k--;
  while( k >= 0 ) {
    fout << sol[k] << " ";
    k--;
  }
  return 0;
}