Cod sursa(job #514468)

Utilizator SpiderManSimoiu Robert SpiderMan Data 18 decembrie 2010 19:31:00
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
# include <cstdio>

const char FIN[] = "scmax.in", FOU[] = "scmax.out" ;
const int MAX = 100005 ;

short best[MAX] ;
int V[MAX], A[MAX], B[MAX] ;
int N ;

void print ( int pos ) {
    if ( B[pos] ) {
        print ( B[pos] ) ;
    }
    printf ( "%d ", V[pos] ) ;
}

int b_search ( int val, int N ) {
    int i, cnt ;

    for ( cnt = 1; cnt << 1 <= N ; cnt <<= 1 ) ;
    for ( i = 0; cnt; cnt >>= 1 ) {
        if ( i + cnt <= N && V[ A[i + cnt] ] < val ) {
            i += cnt ;
        }
    }

    return i ;
}

int main ( void ) {
    freopen ( FIN, "r", stdin ) ;
    freopen ( FOU, "w", stdout ) ;

    scanf ( "%d", &N ) ;
    for ( int i = 1; i <= N; ++i ) {
        scanf ( "%d", V + i ) ;
    }

    int max = 1, pmax = 1 ;

    best[1] = A[1] = 1 ;

    for ( int i = 2, bst = 1; i <= N; ++i ) {
        int pos = b_search ( V[i], bst ) ;
        B[i] = A[pos] ;
        best[i] = ++pos ;
        A[pos] = i ;
        if ( bst < pos )
            bst = pos ;
        if ( max < best[i] ) {
            max = best[i] ;
            pmax = i ;
        }
    }

    printf ( "%d\n", max ) ;
    print ( pmax ) ;
}