Cod sursa(job #1925479)

Utilizator oanaroscaOana Rosca oanarosca Data 13 martie 2017 11:43:30
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>
 
using namespace std;
 
int n, nes, gasit, i, j, e, ind[100001], a[100001], p[100001], s[100001];
 
int cb (int v) {
  int s = 1, d = nes, m;
  do {
    m = (s + d) / 2;
    if (a[ind[m]] < v and v < a[ind[m+1]])
      return m + 1;
    else
      if (v < a[ind[m]])
        d = m - 1;
      else
        s = m + 1;
  } while (s <= d);
  return 1;
}
 
int main () {
  ifstream fi ("scmax.in");
  ofstream fo ("scmax.out");
  fi >> n;
  for (i = 1; i <= n; i++)
    fi >> a[i];
  nes = 1; ind[1] = 1; // numarul de elemente din subsir
  for (i = 2; i <= n; i++) {
    if (a[i] > a[ind[nes]]) {
      p[i] = ind[nes]; nes++; ind[nes] = i;
    }
    else {
      gasit = cb(a[i]);
      p[i] = ind[gasit-1];
      ind[gasit] = i;
    }
  }
  fo << nes << '\n';
  for (i = ind[nes], j = 1; j <= nes; i = p[i], j++)
    s[j] = a[i];
  for (i = nes; i >= 1; i--)
    fo << s[i] << ' ';
  return 0;
}