Cod sursa(job #3217853)

Utilizator ivddabDabelea Ioana-Viviana ivddab Data 24 martie 2024 21:52:22
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.96 kb
#include <bits/stdc++.h>

using namespace std;

int main() {
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

    int n, lmax;
    
    cin >> n;
    vector<int> dp(n, 0);
    vector<int> pred(n, 0);
    vector<int> v;

    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        v.push_back(x);

        int left = 0, right = lmax - 1;
        while (left <= right) {
            int mid = (left + right) / 2;
            
            if (v[dp[mid]] < x) 
                left = mid + 1;
            else 
                right = mid - 1;
        }

        dp[left] = i;
        pred[i] = dp[left - 1];
        lmax = max(lmax, left + 1);
    }

    cout << lmax << "\n";
    int pos = dp[lmax - 1];
    vector<int> sol;
    while (pos != -1) {
        sol.push_back(v[pos]);
        pos = pred[pos];
    }

    reverse(sol.begin(), sol.end());
    for (int i = 0; i < lmax; i++) {
        cout << sol[i] << " ";
    }

    return 0;
}