Cod sursa(job #3290954)

Utilizator lucamLuca Mazilescu lucam Data 2 aprilie 2025 14:20:04
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>
using namespace std;

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

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

int $main() {
    cin >> n;
    v.resize(n);
    dp.resize(n + 1);
    dpi.resize(n + 1);
    p.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;
    p[0] = -1;
    int lmax = 1;
    int ilmax = 0;
    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;
        p[i] = dpi[j];
        if (j + 1 >= lmax) {
            lmax = j + 1;
            ilmax = i;
        }
    }
    cout << lmax << "\n";
    vector<int> ans(lmax);
    for (int i = lmax, j = ilmax; i >= 1; --i) {
        ans[i - 1] = v[j];
        j = p[j];
    }
    for (auto x : ans) {
        cout << x << " ";
    }
    cout << endl;
    return 0;
}
} // namespace

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