Cod sursa(job #1768344)

Utilizator MoodyFaresFares Mohamad MoodyFares Data 30 septembrie 2016 19:15:39
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <cstdio>
const int NMAX = 100000;
using namespace std;
int v[NMAX+5], d[NMAX+5], t[NMAX+5], sol[NMAX+5];
int main() {
    freopen ( "scmax.in", "r", stdin );
    freopen ( "scmax.out", "w", stdout );
    int n, i, ed, st, dr, mid, el, x;
    scanf ( "%d", &n );
    for ( i = 1 ; i <= n ; ++ i )
        scanf ( "%d", &v[i] );
    ed = 1;
    d[1] = 1;
    for ( i = 2 ; i <= n ; ++ i ) {
        st = 1;
        dr = ed;
        while ( st <= dr ) {
            mid = ( st + dr ) / 2;
            if ( v[d[mid]] >= v[i] )
                dr = mid - 1;
            else
                st = mid + 1;
        }
        if ( st == ed + 1 )
            ed++;
        d[st]=i;
        t[i]=d[st-1];
    }
    printf ( "%d\n", ed );
    x = d[ed];
    el = 0;
    while ( x ) {
        sol[++el]=v[x];
        x=t[x];
    }
    for ( i = el ; i > 0 ; -- i )
        printf ( "%d ",sol[i] );
    return 0;
}