Cod sursa(job #744486)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 8 mai 2012 20:36:12
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <algorithm>
#include <cstring>

using namespace std;

#define NMAX 100005
#define PII pair< int, int >
#define val first
#define pos second
#define Bit(x) ( x&(-x) )

int	N, i, LgMax, Ct, CapatSir;
PII	A[NMAX];
int	ValNorm[NMAX];
int	ValAfis[NMAX];
int	D[NMAX];
int	AIB[NMAX];

ifstream in("scmax.in");
ofstream out("scmax.out");

inline int Query( int Pos )
{
	int LgRezMax = 0;
	
	for( int ii = Pos; ii; ii -= Bit( ii ) )
		LgRezMax = max( LgRezMax, AIB[ii] );
	
	return LgRezMax;
}

inline void Update( int Pos, int Val )
{
	for( int ii = Pos; ii <= N; ii += Bit( ii ) )
		AIB[ii] = max( AIB[ii], Val );
}

inline void Afis( int Ind, int Lg, int Val )
{
	if( Lg )
	{
		if( D[Ind] == Lg && ValNorm[ Ind ] <= Val )
		{
			Afis( Ind - 1, Lg - 1, ValNorm[ Ind ] - 1 );
			out << ValAfis[ ValNorm[ Ind ] ] << ' ';
		}
		else
			Afis( Ind - 1, Lg, Val );
	}
}

int main()
{
	in >> N;
	A[0].val = 0;
	for( i = 1; i <= N; ++i )
	{
		in >> A[i].val;
		A[i].pos = i;
	}
	sort( A + 1, A + N+1 );
	for( Ct = 0, i = 1; i <= N; ++i )
		ValNorm[ A[i].pos ] = ( A[i].val == A[i-1].val ) ? Ct : ++Ct,
		ValAfis[ Ct ] = A[i].val;
	
	memset( AIB, 0, sizeof(AIB) );
	memset( D, 0, sizeof(D) );
	LgMax = 0;
	
	for( i = 1; i <= N; ++i )
	{
		D[i] = Query( ValNorm[i] - 1 ) + 1;
		if( D[i] > LgMax )
			LgMax = D[i], CapatSir = i;
		
		Update( ValNorm[i], D[i] );
	}
	
	out << LgMax << '\n';
	Afis( CapatSir, LgMax, ValNorm[ CapatSir ] );
	out << '\n';
	
	return 0;
}