Cod sursa(job #478967)

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

using namespace std;

/*
 *
 */
typedef signed int sint;
typedef vector< sint >::iterator ivector;
sint N;
ivector it, iend;
vector< sint > v, w;
pair< ivector, ivector > p;
sint 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;
    v.push_back(0);
    copy( istream_iterator<sint>(in), istream_iterator<sint>(), back_inserter(v) );
    w=v;
    it=v.begin(), iend=v.end();
    sort( it, iend );
    iend=unique( it, iend );
    for( i=1; 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;
}