Cod sursa(job #1944778)

Utilizator SenibelanMales Sebastian Senibelan Data 29 martie 2017 11:24:53
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100005;
const int oo = 2000000005;
int v[NMAX];
int DP[NMAX];
int previ[NMAX];
int stiva[NMAX];
int N;
int indice;

void Read(){
  in >> N;
  for(int i = 1; i <= N; ++i)
    in >> v[i];
}

int BinarySearch(int no){
  int left = 1, right = indice;
  int mid, sol = oo;
  while(left <= right){
    mid = (left + right) / 2;
    if(no <= v[DP[mid]]){
      sol = mid;
      right = mid - 1;
    }
    else
      left = mid + 1;
  }
  return sol;
}

void Solve(){
  int result;
  for(int i = 1; i <= N; ++i){
    if(!indice)
      DP[++indice] = i;
    else{
      result = BinarySearch(v[i]);
      if(result == oo){
        DP[++indice] = i;
        previ[indice] = indice - 1;
      }
      else
        DP[result] = i;
    }
  }
}

void Print(){
  int stivind = 0;
  out << indice << "\n";
  while(indice){
    stiva[++stivind] = indice;
    indice = previ[indice];
  }
  while(stivind){
    out << v[DP[stiva[stivind]]] << " ";
    --stivind;
  }
}

int main(){
  Read();
  Solve();
  Print();
  return 0;
}