Cod sursa(job #1944698)

Utilizator SenibelanMales Sebastian Senibelan Data 29 martie 2017 10:59:28
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 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 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 <= 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] = v[i];
    else{
      result = BinarySearch(v[i]);
      if(result == oo){
        DP[++indice] = v[i];
        previ[indice] = indice - 1;
      }
      else
        DP[result] = v[i];
    }
  }
}

void Print(){
  out << indice << "\n";
  for(int i = 1; i <= indice; ++i)
    out << DP[i] << " ";
  out << "\n";
}

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