Cod sursa(job #3312544)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 29 septembrie 2025 02:30:27
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <bits/stdc++.h>

using namespace std;

vector<int> a;
vector<pair<int, int>> b;
vector<int> c;

void print_seq(int i) {
  if (b[i].second != -1) {
    print_seq(b[i].second);
  }
  cout << a[i] << " ";
}

int search_pos(int x, pair<int, int>& o) {
  int p = 0;
  int q = o.first;
  while (p < q) {
    int m = (p + q) / 2;
    if (a[c[m]] < x) {
      p = m + 1;
    } else {
      q = m;
    }
  }
  return p;
}

int main() {
#ifndef LOCAL
  freopen("scmax.in", "r", stdin);
  freopen("scmax.out", "w", stdout);
#endif
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n;
  cin >> n;
  a.resize(n);
  b.resize(n, make_pair(0, -1));
  c.resize(n);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }

  pair<int, int> o(0, 0);
  for (int i = 0; i < n; i++) {
    int p = search_pos(a[i], o);
    b[i] = {p + 1, p > 0 ? c[p - 1] : -1};
    c[p] = i;
    if (make_pair(p + 1, 0) > o) {
      o = {p + 1, i};
    }
  }

  cout << o.first << "\n";
  print_seq(o.second);
  cout << "\n";

  return 0;
}