Cod sursa(job #581935)

Utilizator BitOneSAlexandru BitOne Data 14 aprilie 2011 18:59:14
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
#define N_MAX 100011

using namespace std;
int v[N_MAX], l[N_MAX], idx[N_MAX], aib[N_MAX], f[N_MAX];
inline void Update( int x, const int& y, const int& N )
{
    for( ; x <= N; x+=( x & -x ) )
        if( l[aib[x]] < l[y] )
            aib[x]=y;
}
inline int Query( int x )
{
    int idx=0;
    for( ; x; x-=( x & -x ) )
        if( l[aib[x]] > l[idx] )
            idx=aib[x];
    return idx;
}
inline void Output( ostream& out, int x )
{
    if( !x )
        return;
    Output( out, f[x] );
    out<<v[x]<<' ';
}
int main( void )
{
    int *end;
    int N, i, j, lMaxIndex=0;
    ifstream in( "scmax.in" );
    in>>N;
    copy( istream_iterator<int>(in), istream_iterator<int>(), v+1 );
    copy( v+1, v+N+1, l );
    sort( l, l+N );
    end=unique( l, l+N );
    for( i=1; i <= N; ++i )
       if( v[i] == v[i-1] )
            idx[i]=idx[i-1];
       else idx[i]=lower_bound( l, end, v[i] )-l+1;
    l[0]=0;
    for( i=1; i <= N; ++i )
    {
        j=Query( idx[i]-1 );
        f[i]=j;
        l[i]=1+l[j];
        Update( idx[i], i, N );
        if( l[i] > l[lMaxIndex] )
          lMaxIndex=i;
    }
    ofstream out( "scmax.out" );
    out<<l[lMaxIndex]<<'\n';
    Output( out, lMaxIndex );
    out<<'\n';
    return EXIT_SUCCESS;
}