Cod sursa(job #1831770)

Utilizator catu_bogdan_99Catu Bogdan catu_bogdan_99 Data 18 decembrie 2016 18:20:46
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <cstdio>
using namespace std;

#define NMAX 100005

int v[ NMAX ],
    A[ NMAX ],
    D[ NMAX ],
    T[ NMAX ];

int cauta ( int n, int k ) {

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

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

    return i;

}

void afis ( int p ) {

    if ( p == 0 ) return ;

    afis( T[ p ] );
    printf("%d ",v[ p ]);


}

int main () {

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

    int N, M, i, j, x, y, z, id, maxim;
    M = 0;

    scanf("%d",&N);
    for ( i = 1; i <= N; ++i ) {
        scanf("%d",&v[ i ]);
        id = cauta ( M, v[ i ] );
        D[ i ] = id + 1;
        T[ i ] = A[ id ];
        A[ id + 1 ] = i;
        if ( id + 1 > M ) M++;
    }

    id = 1;
    for ( i = 1; i <= N; ++i ) {
        if ( D[ i ] > D[ id ] )
            id = i;
    }

    printf("%d\n",D[ id ]);
    afis ( id );

    return 0;

}