Cod sursa(job #1921350)

Utilizator din99danyMatei Daniel din99dany Data 10 martie 2017 12:18:46
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>
using namespace std;

#define NMAX 100001

int D[ NMAX ];
int V[ NMAX ];
int Id[ NMAX ];
int Tata[ NMAX ];

int cauta ( int k, int n ) {

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

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

    return i;

}

void recon ( int nod ) {

    if ( nod == 0 ) {
        return ;
    }

    recon( Tata[ nod ] );
    printf( "%d ", V[ nod ] );

}

int main () {

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

    int n, m, i, j, x, y, c, k;
    x = 0;

    scanf( "%d",&n );

    m = 0;
    scanf( "%d",&V[ 1 ] );
    Id[ 1 ] = D[ 1 ] = k = 1;
    for ( i = 2; i <= n; ++i ) {
        scanf( "%d",&V[ i ] );
        x = cauta ( V[ i ], m );
        D[ i ] = x + 1;
        if ( D[ k ] < D[ i ] ) k = i;
        Id[ x + 1 ] = i;
        Tata[ i ] = Id[ x ];
        if ( x + 1 > m ) m++;
    }


    printf( "%d\n",D[ k ] );
    recon( k );

    return 0;

}