Cod sursa(job #2247421)

Utilizator catu_bogdan_99Catu Bogdan catu_bogdan_99 Data 28 septembrie 2018 16:32:30
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
#include <iostream>
using namespace std;

#define NMAX 100005

int A[ NMAX ], D[ NMAX ], P[ NMAX ], ST[ NMAX ];

void sir( int i ) {

    if ( P[ i ] != 0 ) {
        sir( P[ i ] );
    }
    printf( "%d ", A[ i ] );

}

int cauta ( int n, int k ) {

    int i = 0, pas = 1 << 17;

    while ( pas ) {
        if ( i + pas <= n && A[ ST[ i + pas ] ] < k )
            i += pas;
        pas /= 2;
    }

    return i;

}

int main () {

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

    int n, i, j, m, k, ma;
    ma = m = 0;

    scanf( "%d", &n );
    for ( i = 1; i <= n; ++i ) {
        scanf( "%d", &A[ i ] );
        D[ i ] = 1;
    }

    for ( i = 1; i <= n; ++i ) {
        k = cauta( m, A[ i ] );
        D[ i ] = k + 1;
        P[ i ] = ST[ k ];
        ST[ k + 1 ] = i;
        if ( k + 1 > m ) m = k + 1;
        ma = max( ma, D[ i ] );
    }

    printf( "%d\n", ma );
    for ( i = n; i >= 1; --i ) {
        if ( D[ i ] == ma ) {
            sir( i );
            i = 0;
        }
    }

    return 0;

}