Cod sursa(job #1632644)

Utilizator pickleVictor Andrei pickle Data 6 martie 2016 10:38:09
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;
const int Nmax = 100555;

int N, A[Nmax], B[Nmax], ind[Nmax], par[Nmax], ans[Nmax];

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

  fin >> N;
  for (int i = 0; i < N; ++i) {
    fin >> A[i];
  }

  B[0] = A[0];
  par[0] = -1;
  ind[0] = 0;
  int l = 1, *q;

  for (int i = 1; i < N; ++i) {
    q = lower_bound(B, B+l, A[i]);
    int j = q - B;
    if (*q == A[i])
      continue;
    if (j == l)
      ++l;
    B[j] = A[i];
    ind[j] = i;
    par[i] = (j > 0 ? ind[j-1] : -1);
  }

  fout << l << endl;

  int i = ind[l-1], x;
  while(i > -1) {
    x = A[i];
    ans[++ans[0]] = x;
    i = par[i];
  }

  for(int k = l; k >= 1; --k) {
    fout << ans[k] << ' ';
  }

  fout << endl;

  return 0;
}