Cod sursa(job #3290950)

Utilizator lucamLuca Mazilescu lucam Data 2 aprilie 2025 13:43:25
Problema Subsir crescator maximal Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
#include <bits/stdc++.h>
using namespace std;

namespace {
int n;
vector<int> v;
vector<int> dp;
vector<int> dpi;
vector<int> prev;

ifstream cin("scmax.in");
ofstream cout("scmax.out");

int $main() {
    cin >> n;
    v.resize(n);
    dp.resize(n + 1);
    dpi.resize(n + 1);
    prev.resize(n);
    for (auto &x : v) {
        cin >> x;
    }
    int inf = 2e9 + 2;
    fill(dp.begin() + 1, dp.end(), inf);
    dp[0] = -inf;
    dp[1] = v[0];
    dpi[1] = 0;
    prev[0] = -1;
    int lmax = 1;
    for (int i = 1; i < n; ++i) {
        int j = n
            - (upper_bound(dp.rbegin(), dp.rend(), v[i], greater{})
               - dp.rbegin());
        dp[j + 1] = v[i];
        dpi[j + 1] = i;
        if (j + 1 > lmax) {
            lmax = j + 1;
            prev[i] = dpi[j];
        }
    }
    cout << lmax << "\n";
    for (int i = 1, j = dpi[lmax]; i <= lmax; ++i, j = prev[j]) {
        cout << v[j] << " ";
    }
    cout << endl;
    return 0;
}
} // namespace

int main() {
    return $main();
}