Cod sursa(job #672513)

Utilizator BitOneSAlexandru BitOne Data 2 februarie 2012 13:34:13
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <vector>
#include <fstream>
#include <cstdlib>
#include <iterator>
#include <algorithm>
#define N_MAX 100011

using namespace std;


int v[N_MAX], w[N_MAX], idx[N_MAX], l[N_MAX], f[N_MAX], aib[N_MAX];

inline void Update( int N, int xIndex, int xValue )
{
	for( int z=xIndex;  z <= N; z+=(z & -z) )
		if( l[aib[z]] < xValue )
			aib[z]=xIndex;
}
inline int Query( int xIndex ) 
{
	int mIndex=0;
	for( ; xIndex > 0; xIndex-= (xIndex & -xIndex) )
		if( l[aib[xIndex]] > l[aib[mIndex]] )
			mIndex=xIndex;			
	return mIndex;	
}
inline void Output( ostream& out, int& x )
{
	if( 0 == f[x] )
		out<<v[x]<<' ';
	else {
			Output( out, f[x] );
			out<<v[x]<<' ';
		 }
}
int main()
{
	int N, i, maxIndex=0;
	ifstream in( "scmax.in" );
	ofstream out( "scmax.out" );
	
	in>>N;
	copy( istream_iterator<int>(in), istream_iterator<int>(), v+1 );
	copy( v+1, v+1+N, w );
	sort( w+1, w+N+1 );	
	for( i=1; i <= N; ++i )
		idx[i]=lower_bound( w, w+N, v[i] )-w+1;
	for( i=1; i <= N; ++i )
	{
		f[i]=Query( idx[i]-1 );
		l[i]=1+l[f[i]];
		Update( N, idx[i], l[i] );
		if( l[i] > l[maxIndex] )
			maxIndex=i;
	}
	out<<l[maxIndex]<<'\n';
	Output( out, maxIndex ); 
	return EXIT_SUCCESS;
}