Cod sursa(job #3304486)

Utilizator Grama2008Grama Andrei Teodor Grama2008 Data 24 iulie 2025 12:14:41
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.1 kb
#include <bits/stdc++.h>

using namespace std;

const int N=2e5+5;

int dp[N], v[N], parent[N];

int bin(int left, int right, int val){
    int ans=right;
    while (left<=right){
        int mid=(left+right)/2;
        if (v[dp[mid]]<val){
            ans=mid;
            left=mid+1;
        }
        else{
            right=mid-1;
        }
    }
    return ans;
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    memset(dp, (1<<6)-1, sizeof(dp));
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;cin>>n;
    for (int i=1;i<=n;i++){
        cin>>v[i];
    }
    dp[0]=0;
    int ans=0;
    for (int i=1;i<=n;i++){
        int poz=bin(0, ans, v[i]);
        if (v[dp[poz]]<v[i] && (dp[poz+1]>1e9 || v[dp[poz+1]]>v[i])){
            dp[poz+1]=i;
            parent[i]=dp[poz];
            ans=max(ans, poz+1);
        }
    }
    int node=dp[ans];
    vector<int> path;
    while (node!=0){
        path.push_back(node);
        node=parent[node];
    }
    cout<<ans<<'\n';
    for (int i=path.size()-1;i>=0;i--){
        cout<<v[path[i]]<<' ';
    }
    return 0;
}