Cod sursa(job #2870972)

Utilizator PechiPecherle George Pechi Data 12 martie 2022 19:08:43
Problema Subsir crescator maximal Scor 85
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 kb
// sclm O(NlogN)
#include <bits/stdc++.h>

using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

int n;
vector<int> a,dp,pos,sol;

int main()
{
    fin>>n;
    a.resize(n+1);
    dp.resize(n+1);
    pos.resize(n+1);

    for(int i=1;i<=n;i++)
        fin>>a[i];

    int k = 1;
    dp[1] = a[1];
    for(int i=2;i<=n;i++)
        if(a[i] > dp[k])
        {
            dp[++k] = a[i];
            pos[i] = k;
        }
        else
        {
            int pozitie = upper_bound(dp.begin(),dp.begin()+k,a[i]) - dp.begin();
            dp[pozitie] = a[i];
            pos[i] = pozitie;
        }

    int j = n;
    for(int i = k; i>=1; i--)
    {
        while(pos[j]!= i)
            j--;
        sol.push_back(a[j]);
    }

    fout<<sol.size()<<'\n';
    for(auto rit = sol.rbegin(); rit!= sol.rend(); rit++)
        fout<<*rit<<' ';
    return 0;
}