Cod sursa(job #3363391)

Utilizator vrebiegiegrejgoperpegorogpePopescu Alexandru vrebiegiegrejgoperpegorogpe Data 17 august 2026 13:27:09
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.18 kb
#include <iostream>

using namespace std;

int v[100005], dp[100005], pre[100005], sol[100005];

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

    int n, Lmax = 0;
    cin >> n;

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

    for(int i = 1; i <= n; i++)
    {
        int st = 1;
        int dr = Lmax;
        int poz = Lmax + 1;

        while(st <= dr)
        {
            int mij = (st + dr) / 2;

            if(v[dp[mij]] >= v[i])
            {
                poz = mij;
                dr = mij - 1;
            }

            else {
                st = mij + 1;
            }
        }

        if(poz > 1)
        {
            pre[i] = dp[poz - 1];
        }

        else
        {
            pre[i] = 0;
        }

        dp[poz] = i;

        if(poz > Lmax)
        {
            Lmax = poz;
        }
    }

    cout << Lmax << "\n";

    int x = dp[Lmax], k = Lmax;

    while(x != 0)
    {
        sol[k] = v[x];
        k--;
        x = pre[x];
    }

    for(int i = 1; i <= Lmax; i++)
    {
        cout << sol[i] << " ";
    }
    return 0;
}