Cod sursa(job #581715)

Utilizator BitOneSAlexandru BitOne Data 14 aprilie 2011 15:31:24
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
#define N_MAX 100011
#define oo 1<<29

using namespace std;
int N;
int v[N_MAX], v2[N_MAX], idx[N_MAX], aib[N_MAX], longTail[N_MAX];
inline int _max( int x, int y ) { return ( x >= y ? x : y ); }
inline int _min( int x, int y ) { return ( x <= y ? x : y ); }
inline void Update( int x, int y )
{
    for( ; x <= N; x+=( x & -x ) )
       aib[x]=_max( aib[x], y );
}
inline int Query( int x )
{
    int value=0;
    for( ; x; x-=( x & -x ) )
        value=_max( aib[x], value );
    return value;
}
int main( void )
{
    int i, j, maxL=0;
    ifstream in( "scmax.in" );
    in>>N;
    copy( istream_iterator<int>(in), istream_iterator<int>(), v+1 );
    copy( v+1, v+N+1, v2 );
    sort( v2, v2+N );
    for( i=1; i <= N; ++i )
    {
        longTail[i]=oo;
        if( v[i] == v[i-1] )
            idx[i]=idx[i-1];
        else idx[i]=lower_bound( v2, v2+N, v[i] )-v2+1;
    }
    for( i=1; i <= N; ++i )
    {
        maxL=_max( maxL, j=Query( idx[i]-1 )+1 );
        longTail[j]=_min( longTail[j], v[i] );
        Update( idx[i], j );
    }
    ofstream out( "scmax.out" );
    out<<maxL<<'\n';
    copy( longTail+1, longTail+maxL+1, ostream_iterator<int>( out, " ") );
    out<<'\n';
    return EXIT_SUCCESS;
}