Cod sursa(job #492167)

Utilizator BitOneSAlexandru BitOne Data 13 octombrie 2010 17:32:01
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
/* 
 * File:   main.cpp
 * Author: bitone
 *
 * Created on October 13, 2010, 3:58 PM
 */
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
#define MAX_N  100011

using namespace std;
/*
 *
 */
int N;
int v[MAX_N], w[MAX_N], _index[MAX_N], f[MAX_N], l[MAX_N], aib[MAX_N];
inline void Update( int x, int y )
{
    for( ; x <= N; x+=( x & -x ) )
        if( l[aib[x]] < l[y] )
            aib[x]=y;
}
inline int Query( int x )
{
    int mindex=0;
    for( ; x; x-=( x & -x ) )
        if( l[aib[x]] > l[mindex] )
            mindex=aib[x];
    return mindex;
}
inline void output( ostream& out, int index )
{
    if( index )
    {
        output( out, f[index] );
        out<<v[index]<<' ';
    }
}
int main( void )
{
    int *new_end;
    int i, mindex=0;
    ifstream in( "scmax.in" );
    in>>N;
    copy( istream_iterator<int>(in), istream_iterator<int>(), v+1 );
    copy( v+1, v+N+1, w+1 );
    sort( w+1, w+N+1 );
    new_end=unique( w+1, w+N+1 );
    for( i=1; i <= N; ++i )
        if( v[i] == v[i-1] )
            _index[i]=_index[i-1];
        else _index[i]=lower_bound( w+1, new_end, v[i] )-w;
    for( i=1; i <= N; ++i )
    {
        f[i]=Query(_index[i]-1);
        l[i]=1+l[f[i]];
        Update( _index[i], i );
        if( l[i] > l[mindex] )
            mindex=i;
    }
    ofstream out( "scmax.out" );
    out<<l[mindex]<<'\n';
    output( out, mindex );
    out<<'\n';
    return EXIT_SUCCESS;
}