Cod sursa(job #2949894)

Utilizator smunteanuMunteanu Stefan Catalin smunteanu Data 2 decembrie 2022 04:25:18
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>
using namespace std;

const int nmax = 1e5 + 7;

static int n;
static int a[nmax];
static int nrm[nmax];
static int aib[nmax];
static int val[nmax];
static int pt[nmax];

int find(int p) {
  int r = aib[0];
  for (; p; p -= p & -p) if (val[aib[p]] > val[r]) r = aib[p];
  return r;
}

void add(int p, int v) {
  for (; p <= n; p += p & -p) if (val[aib[p]] < val[v]) aib[p] = v;
}

void solve() {
  
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i], nrm[i] = a[i];

  int sz = 1;
  sort(nrm + 1, nrm + n + 1);
  for (int i = 2; i <= n; i++) if (nrm[sz] != nrm[i]) nrm[++sz] = nrm[i];

  for (int i = 1; i <= n; i++) a[i] = lower_bound(nrm + 1, nrm + sz + 1, a[i]) - nrm;

  for (int i = 1; i <= n; i++) {
    int f = find(a[i] - 1);
    pt[i] = f;
    val[i] = val[f] + 1;
    add(a[i], i);
  }

  int p = find(n);

  vector<int> res(val[p]);

  for (int i = val[p] - 1; i >= 0; i--) {
    res[i] = p;
    p = pt[p];
  }

  cout << res.size() << '\n';
  for (int r : res) cout << nrm[a[r]] << ' ';
  
}

int main() {

  #ifdef LOCAL
  freopen("file.in", "r", stdin);
  #else
  freopen("scmax.in", "r", stdin);
  freopen("scmax.out", "w", stdout);
  #endif

  ios_base::sync_with_stdio(false), cin.tie(NULL);

  solve();
}