Cod sursa(job #3361649)

Utilizator prodsevenStefan Albu prodseven Data 27 iulie 2026 10:34:04
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

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

int n;
vector<int> v, dp, v_idx_for_dp_idx, parent, ans; // cel mai mic nr din v cu care se termina un subsir de lungime l

int main() {
    cin >> n;
    v.resize(n + 2);
    v_idx_for_dp_idx.resize(n + 2, -1);
    parent.resize(n + 2, -1);
    dp.assign(n + 2, INT_MAX);
    for (int i = 1; i <= n ; ++i) {
        cin >> n;
    }
    for (int i = 1 ; i <= n ; ++i) {
        int target_idx = upper_bound(dp.begin(), dp.end(), v[i]) - dp.begin();
        if (v[i] < dp[target_idx] && v[i] > dp[target_idx - 1]) {
            dp[target_idx] = v[i];
            v_idx_for_dp_idx[target_idx] = i;
            if (target_idx > 0) parent[i] = v_idx_for_dp_idx[target_idx - 1];
        }
    }
    int backwards_start = -1;
    for (int i = n ; i >= 1 ; --i) {
        if (dp[i] != INT_MAX) {
            cout << i << "\n";
            backwards_start = v_idx_for_dp_idx[i];
            break;
        }
    }
    for (int i = backwards_start ; i != -1 ; i = parent[i]) {
        ans.push_back(v[i]);
    }
    reverse(ans.begin(), ans.end());
    for (int elem : ans) {
        cout << elem << " ";
    }
    return 0;
}