Cod sursa(job #447288)

Utilizator alutzuAlexandru Stoica alutzu Data 28 aprilie 2010 12:08:57
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include<cstdio>

int m ;
const int NMAX = 1 << 17 ;
int x [NMAX],v[NMAX],pred[NMAX];

int caut ( int q )
{
	int i , pas = 1 << 16 ;
	
	for ( i = 0 ; pas ; pas >>= 1 )
		if ( i+pas <= m && v[x[i+pas]]<q )
			i += pas ;
	return 1+i;
}

void qq ( int x )
{
	if ( pred[x] != 0 )
		qq ( pred[x] ) ;
	printf ( "%d " , v[x]);
	
}

int main () 
{
	
	freopen ( "scmax.in" , "r" , stdin ) ;
	freopen ( "scmax.out" , "w" , stdout ) ;
	
	int n , i , p ;
	
	scanf ( "%d" , &n ) ;
	
	for ( i = 1 ; i <= n ; ++ i )
		scanf ( "%d" , & v[i] ) ;
	
	m=0;
	x[++m]=1;
	
	for ( i = 2 ; i <= n ; ++ i )
	{
		p = caut ( v[i] ) ;
		
		if ( p > m )
			++ m ;
		x[p]=i;
		pred[i]=x[p-1];
	}
	
	printf ( "%d\n" , m ) ;
	
	qq ( x[m] ) ;
	
	return 0 ;
}