Cod sursa(job #406676)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 1 martie 2010 18:53:32
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <algorithm>
using namespace std;

#define DIM 100005
#define MAX 10005

char s[ MAX ];
int xXx, ind_xXx;
int N, A[ DIM ];
int cnt_s, max_lng, ant[ DIM ], ind[ DIM ], sol[ DIM ];

inline int c_bin( const int &val ) {

    int mid, left, right;

    left = 0;
    right = max_lng;

    while( left <= right ) {

        mid = ( left + right ) / 2;

        if( A[ ind[ mid ] ] < val && val <= A[ ind[ mid+1 ] ] )
            return mid;

        if( A[ ind[ mid+1 ] ] < val )
            left = mid+1;
        else
            right = mid-1;
    }

    return max_lng;
}

inline void print( const int &val ) {

    if( ant[ val ] )
        print( ant[ val ] );

    printf( "%d ", A[ val ] );
}

inline void read( int &val ) {

    while( !isdigit( s[ cnt_s ] ) )
        if( ++cnt_s == MAX ) {

            fread( s, 1, cnt_s, stdin );
            cnt_s = 0;
        }

    val = 0;
    while( isdigit( s[ cnt_s ] ) ) {

        val = val*10 + s[ cnt_s ] - '0';
        if( ++cnt_s == MAX ) {

            fread( s, 1, MAX, stdin );
            cnt_s = 0;
        }
    }
}

int main() {

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

    int i, lng;

    cnt_s = 0;

    read( N );
    for( i = 1; i <= N; ++i )
        read( A[ i ] );

    ind[ 1 ] = 1;
    sol[ 1 ] = 1;

    for( i = 2; i <= N; ++i ) {

        lng = c_bin( A[ i ] );

        sol[ i ] = lng + 1;
        ant[ i ] = ind[ lng ];
        ind[ lng+1 ] = i;
        max_lng = max( max_lng, lng+1 );

        if( sol[ i ] > xXx ) {

            xXx = sol[ i ];
            ind_xXx = i;
        }
    }

    printf( "%d\n", xXx );
    print( ind_xXx );

    return 0;
}