Cod sursa(job #2449492)

Utilizator ejoi2019Ejoi 2019 ejoi2019 Data 19 august 2019 22:24:07
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <iostream>
#include <map>
#include <set>


using namespace std;

const int N = 100001;
set <int> s;
map <int, int> d;
int n, a[N], b[N];
int dp[N];

pair <int, int> t[N];

void upd(int p, int x, int i) {
  while (p <= n) {
    t[p] = max(t[p], {x, i});
    p += p & (-p);
  }
}

pair <int, int> get(int p) {
  pair <int, int> it = {0, 0};
  while (p) {
    it = max(it, t[p]);
    p -= p & (-p);
  }
  return it;
}

int par[N];
int ans[N];

int main() {
  freopen ("scmax.in","r",stdin);
  freopen ("scmax.out","w",stdout);

  scanf("%d\n", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    s.insert(a[i]);
  }
  int now = 0;
  for (auto &x : s)
    d[x] = ++now;
  for (int i = 1; i <= n; i++) {
    b[i] = d[a[i]];
    pair <int, int> it = get(b[i] - 1);
    dp[i] = it.first + 1;
    par[i] = it.second;
    upd(b[i], dp[i], i);
  }
  int sol = get(n).first;

  for (int i = 1; i <= n; i++)
    if (dp[i] == sol)
      now = i;

  int cur = sol;
  ans[cur] = now;

  while (cur - 1 >= 1) {
    cur--;
    now = par[now];
    ans[cur] = now;
  }

  printf("%d\n", sol);
  for (int i = 1; i <= sol; i++)
    printf("%d ", a[ans[i]]);
  printf("\n");

  return 0;
}