Cod sursa(job #2263267)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 18 octombrie 2018 15:44:03
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define mp make_pair
#define CHECK(x) if(!(x)) return false;
#define CHECKRET(x, y) if(!(x)) return (y);
#define SKIP(x) if((x)) continue;
typedef pair<int, int> pii;

#ifdef INFOARENA
#define ProblemName "scmax"
#else
#define ProblemName "fis"
#endif

#define MCONCAT(A, B) A B
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")

const int MAXN = 100010;
int v[MAXN], T[MAXN], prv[MAXN];
int N;

int lis() {
  int L = 0;
  for (int i = 0; i < N; ++i) {
    int idx = lower_bound(T, T + L, i, [](int i, int j) {return v[i] < v[j]; }) - T;
    if (idx == L) ++L;
    else SKIP(v[T[idx]] <= v[i]);
    T[idx] = i;
    prv[i] = (idx > 0) ? T[idx - 1] : (-1);
  }
  return L;
}

int main() {
  assert(freopen(InFile, "r", stdin));
  assert(freopen(OuFile, "w", stdout));
  scanf("%d", &N);
  for (int i = 0; i < N; ++i)
    scanf("%d", &v[i]);
  int L = lis();
  printf("%d\n", L);
  stack<int> S;
  for (int cur = T[L - 1]; cur >= 0; S.push(cur), cur = prv[cur]);
  for (; !S.empty(); printf("%d ", v[S.top()]), S.pop());
  return 0;
}