Cod sursa(job #2239155)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 9 septembrie 2018 16:54:04
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
  freopen ("scmax.in", "r", stdin);
  freopen ("scmax.out", "w", stdout);
  int n;
  scanf("%d", &n);
  vector <int> v(n);
  vector <int> id;
  vector <int> dad(n);
  for (int i = 0; i < n; i ++) {
    scanf("%d", &v[i]);
    if (i == 0 || v[id.back()] < v[i]) {
      if (i == 0) {
        dad[i] = - 1;
      }
      else {
        dad[i] = id.back();
      }
      id.push_back(i);
      continue;
    }
    int lo = 0;
    int hi = id.size() - 1;
    int last = - 1;
    while (lo <= hi) {
      int mid = (lo + hi) / 2;
      if(v[id[mid]] < v[i]) {
        lo = mid + 1;
      }
      else {
        last = mid;
        hi = mid - 1;
      }
    }
    id[last] = i;
    if (last) {
      dad[i] = id[last - 1];
    }
    else {
      dad[i] = - 1;
    }
  }
  int itr = id.back();
  vector <int> ans;
  while (itr != -1) {
    ans.push_back(itr);
    itr = dad[itr];
  }
  reverse(ans.begin(), ans.end());
  printf("%d\n", ans.size());
  for (auto x: ans) {
    printf("%d ", v[x]);
  }
  printf("\n");
  return 0;
}