Cod sursa(job #478965)

Utilizator BitOneSAlexandru BitOne Data 21 august 2010 14:29:46
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
/* 
 * File:   main.cpp
 * Author: bitone
 *
 * Created on August 21, 2010, 1:10 PM
 */
#include <cstring>
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
#define MAX_N 100011

using namespace std;

/*
 *
 */
typedef signed int sint;
sint N;
sint *it, *iend;
pair< sint*, sint* > p;
sint v[MAX_N], w[MAX_N], f[MAX_N], l[MAX_N], aib[MAX_N];
void UpDate( sint x, sint y )
{
    for( ; x <= N; x+=( x & -x ) )
        aib[x]=( l[y] > l[aib[x]] ? y : aib[x] );
}
sint Query( sint x )
{
    sint maxim=0;
    for( ; x; x-=( x & -x ) )
       maxim=( l[maxim] < l[aib[x]] ? aib[x] : maxim );
    return maxim;
}
inline void Output( sint idx, ostream& out )
{
    if( idx )
    {
        Output( f[idx], out );
        out<<v[idx]<<'\n';
    }
}
int main( void )
{
    sint i, idx, maxim=0;
    ifstream in( "scmax.in" );
    in>>N;
    copy( istream_iterator<sint>(in), istream_iterator<sint>(), v+1 );
    memcpy( w, v, N*sizeof(sint) );
    it=w+1, iend=w+N+1;
    sort( it, iend );
    iend=unique( it, iend );
    l[1]=1;
    for( i=2; i <= N; ++i )
    {
        p=equal_range( it, iend, v[i] );
        idx=p.first-it+1;
        f[i]=Query( idx-1 );
        l[i]=1+l[f[i]];
        UpDate( idx, i );
        maxim=( l[i] > l[maxim] ? i : maxim );
    }
    ofstream out( "scmax.out" );
    out<<l[maxim]<<'\n';
    Output( maxim, out );
    return EXIT_SUCCESS;
}