Cod sursa(job #2705421)

Utilizator ElektrykT E S L A P E F E L I E Elektryk Data 12 februarie 2021 16:21:57
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.29 kb
#include <bits/stdc++.h>

using namespace std;

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

int v[100001],l[100001],vmin[100001];

void subsir ( int p );

int n;

int k,imax,st,dr,m,ans;

int main()
{
    in >> n;
    for ( int i = 1 ; i <= n ; ++i )
        in >> v[i];
    l[1] = 1;
    k = 1;
    vmin[2] = v[1];
    imax = 0;
    for ( int i = 1 ; i <= n ; ++i )
    {
        st = 1;
        dr = k;
        ans = 0;
        while ( st <= dr )
        {
            m = ( st + dr ) / 2;
            if ( v[i] > vmin[m] )
            {
                ans = m;
                st = m+1;
            }
            else
                dr = m-1;
        }
        if ( ans )
        {
            if ( ans == k )
            {
                vmin[++k] = v[i];
                imax = i;
            }
            else
                vmin[ans+1] = v[i];
        }
        else
        {
            if ( v[i] < vmin[1] )
                vmin[1] = v[i];
        }
        l[i] = ans;
    }
    out << l[imax] << '\n';
    subsir ( imax );
    return 0;
}

void subsir ( int p )
{
    int i = p;
    while ( i >= 1  &&  ( v[i] >= v[p]  ||  l[i] != l[p] - 1 ) )
        --i;
    if ( i >= 1 )
        subsir (i);
    out << v[p] << " ";
}