Cod sursa(job #3030811)

Utilizator gabriel10tm@gmail.comGabriel Marian [email protected] Data 17 martie 2023 21:38:00
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>
using namespace std;
const int nmx = 1e5 + 5;
const int inf = 1e17;
int a[nmx];
int dp[nmx],t[nmx],id[nmx];
#define cin fin
#define cout fout
ifstream fin("scmax.in");
ofstream fout("scmax.out");
// dp[i] - cel mai mic element cu care se termina subsirul crescator de lungime i
// dp[i] =
int main(){
    int n;
    cin >> n;
    for(int i=1;i<=n;i++)
        cin >> a[i],dp[i]=inf;
    dp[0] = -inf;
    for(int i=1;i<=n;i++){
        int idx = upper_bound(dp,dp+1+n,a[i])-dp;
        if(dp[idx]>a[i] && a[i]>dp[idx-1]){
            dp[idx]=a[i];
            id[idx]=i;
            t[id[idx]]=id[idx-1];
        }
    }
    int it = 0,sz=0;
    for(int i=1;i<=n;i++)
        if(dp[i]!=inf){
            it = id[i];
            sz=i;
        }
    cout << sz << "\n";
    vector<int> p;
    while(it){
        //cout << a[i]
        p.push_back(a[it]);
        it = t[it];
    }
    reverse(p.begin(),p.end());
    for(int c : p)
        cout << c << " ";
}