Cod sursa(job #2982101)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 19 februarie 2023 15:47:37
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.89 kb
#include <fstream>
using namespace std;

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

int best[ 100005 ];
int rez[ 100005 ];
int f[ 100005 ];
int v[ 100005 ];
int k, n;

int cb( int nr ) {
    int st = 1, dr = k;
    int mij, poz = 0;
    while( st <= dr ) {
        mij = ( st + dr ) / 2;
        if( v[ best[ mij ] ] < nr ) {
            poz = mij;
            st = mij + 1;
        } else dr = mij - 1;
    }
    return poz;
}

int main()
{
    cin >> n;
    for( int i = 1; i <= n; i++ ) {
        cin >> v[ i ];
        int poz = cb( v[ i ] );
        best[ poz + 1 ] = i;
        if( poz == k )
            k++;
        f[ i ] = best[ poz ];
    }

    cout << k << '\n';
    int pozc = best[ k ], d = 0;
    while( pozc != 0 ) {
        rez[ ++d ] = v[ pozc ];
        pozc = f[ pozc ];
    }

    for( int i = d; i >= 1; i-- )
        cout << rez[ i ] << ' ';
    cout << '\n';
    return 0;
}