Cod sursa(job #2418146)

Utilizator lucametehauDart Monkey lucametehau Data 3 mai 2019 20:16:27
Problema Subsir crescator maximal Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.83 kb
#include <fstream>

using namespace std;

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

int n, x, sol, p;

int v[100005], dp[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];
      if(!poz[st] && i > poz[st - 1])
        poz[st] = i;
    }
  }
  for(int i = 0; i <= n; i++) {
    if(dp[i] != 2e9)
      sol = i;
  }
  cout << sol << "\n";
  print(sol);
  return 0;
}