Cod sursa(job #2759169)

Utilizator Alex_DiaconuDiaconu Alexandru Alex_Diaconu Data 15 iunie 2021 19:28:25
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream cin ("scmax.in");
ofstream cout ("scmax.out");

int n, a[100001], nr, dp[100001], l, v[100001], sol[100001], cl;

void read()
{
    cin >> n;
    for (int i=1; i<=n; i++)
        {
            cin >> a[i];
        }
}

int cautare_binara(int x)
{
    int st, dr, mij;
    st=1;
    dr=l;
    while (st<=dr)
    {
        mij=(st+dr)/2;
        if (v[mij]>=x)
            {
                dr=mij-1;
            }
        else
        {
            st=mij+1;
        }
    }
    v[st]=x;
    return st;
}

void solve()
{
    for (int i=1; i<=n; i++)
    {
        if (a[i]>v[l])
        {
            dp[i]=l+1;
            v[++l]=a[i];
        }
        else
            dp[i]=cautare_binara(a[i]);
    }
    cl=l;
    for (int i=n; i>=1; i--)
    {
        if (dp[i]==l)
        {
            sol[l]=a[i];
            l--;
        }
    }
}

void output()
{
    cout << cl << '\n';
    for (int i=1; i<=cl; i++)
    {
        cout << sol[i] << ' ';
    }
}

int main()
{
    read();
    solve();
    output();
    return 0;
}