Cod sursa(job #2418157)

Utilizator lucametehauDart Monkey lucametehau Data 3 mai 2019 21:14:39
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#include <algorithm>

using namespace std;

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

int n, x, sol, p;

int v[100005], dp[100005], a[100005], poz[100005];

void print(int p) {
  if(p > 1)
    print(p - 1);
  cout << v[poz[p]] << " ";
}

int main() {
  cin >> n;
  for(int i = 1; i <= n; i++) {
    cin >> v[i];
    dp[i] = 2e9;
  }
  dp[0] = -2e9;
  for(int i = 1; i <= n; i++) {
    int st = 0, dr = n, mid;
    while(st <= dr) {
      mid = (st + dr) >> 1;
      if(dp[mid] <= v[i])
        st = mid + 1;
      else
        dr = mid - 1;
    }
    if(dp[st - 1] < v[i] && v[i] < dp[st])
      dp[st] = v[i], a[i] = st;
  }
  for(int i = 0; i <= n; i++) {
    if(dp[i] < 2e9)
      sol = i;
  }
  cout << sol << "\n";
  for(int i = n; i >= 1; i--) {
    if(a[i] == sol)
      poz[++poz[0]] = v[i], sol--;
  }
  reverse(poz + 1, poz + poz[0] + 1);
  for(int i = 1; i <= poz[0]; i++)
    cout << poz[i] << " ";
  return 0;
}