Cod sursa(job #3328220)

Utilizator prodsevenStefan Albu prodseven Data 7 decembrie 2025 10:54:37
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

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

vector<int> v, d, indice, parent;
int n;

int main() {
    cin >> n;
    v.resize(n + 2);
    parent.resize(n + 2, -1);
    d.resize(n + 2, INT_MAX);
    indice.resize(n + 2, -1);
    for (int i = 1 ; i <= n ; ++i) {
        cin >> v[i];
    }
    d[0] = INT_MIN;
    for (int i = 1 ; i <= n ; ++i) {
        int j = upper_bound(d.begin(), d.end(), v[i]) - d.begin();
        if (v[i] < d[j] && v[i] > d[j - 1]) {
            d[j] = v[i];
            indice[j] = i;
            if (j > 0) parent[i] = indice[j - 1];
        }
    }
    int max_len, poz;
    for (int i = n ; i >= 1 ; --i) {
        if (d[i] != INT_MAX) {
            cout << i << "\n";
            poz = indice[i];
            break;
        }
    }

    vector<int> ans;
    for (int i = poz ; i != -1 ; i = parent[i]) {
        ans.push_back(v[i]);
    }
    reverse(ans.begin(), ans.end());
    for (int elem : ans) {
        cout << elem << " ";
    }

    return 0;
}