Cod sursa(job #2296492)

Utilizator berindeiChesa Matei berindei Data 4 decembrie 2018 18:47:00
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.77 kb
#include <bits/stdc++.h>
using namespace std;
int const NMAX=1e5+10;

int v[NMAX], dp[NMAX], last[NMAX];

int main(){
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    int n;
    int lmax=0;
    cin >> n;
    for (int i=1; i<=n; i++){
        cin >> v[i];
        if (v[i]>last[lmax]){
            last[++lmax]=v[i];
            dp[i]=lmax;
            continue;
        }
        int poz=(int)(lower_bound(last, last+lmax+1, v[i])-last);
        dp[i]=poz;
        if (last[poz]>v[i]) last[poz]=v[i];
    }
    cout << lmax << '\n';
    vector<int> ans;
    for (int target=lmax, i=n; i>=1; i--)
        if (dp[i]==target) ans.push_back(v[i]), --target;
    reverse(ans.begin(), ans.end());
    for (auto x: ans) cout << x << ' ';
}