Cod sursa(job #3253313)

Utilizator AlfexAlex Florea Alfex Data 2 noiembrie 2024 11:21:31
Problema Subsir crescator maximal Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>

using namespace std;
int v[100001], k=1, dp[100001],last[100001];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    freopen("scmax.in", "r",stdin);
    freopen("scmax.out", "w",stdout);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>v[i];
    dp[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(v[i]>v[dp[k]])
        {
            last[i]=dp[k];
            k++;
            dp[k]=i;
        }
        else
        {
            int st=1, dr=k;
            while(st<=dr)
            {
                int mij=(st+dr)/2;
                if(v[dp[mij]]>v[i])
                {
                    dr=mij-1;
                }
                else st=mij+1;
            }
            last[i]=last[dp[st]];
            dp[st]=i;
        }
    }
    cout<<k<<'\n';
    vector<int> ans;
    int x=dp[k];
    ans.push_back(v[x]);

    while(last[x])
    {
        x=last[x];
        ans.push_back(v[x]);
    }
    sort(ans.begin(),ans.end());
    for(auto e:ans)
        cout<<e<<" ";

    return 0;
}