Cod sursa(job #403504)

Utilizator TabaraTabara Mihai Tabara Data 24 februarie 2010 23:46:40
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <fstream>
using namespace std;

const char* in = "scmax.in";
const char* out = "scmax.out";
const int NMAX = 100005;

int A[NMAX], P[NMAX], cnt, poz[NMAX];
int N;

int main( void )
{
	freopen ( in, "r", stdin );
	freopen ( out, "w", stdout );

	scanf ( "%d", &N );
	int i, bl, br, bm, last;
	for ( i = 1; i <= N; scanf("%d", A+i++ ) );

	for ( i = 1; i <= N; ++i )
	{
		if ( A[i] > P[cnt] )
			P[++cnt] = A[i], poz[i] = cnt;
		else
		{
			for ( bl = 1, br = cnt, last = cnt; bl <= br; )
			{
				bm = (bl+((br-bl)>>1));
				if ( P[bm] < A[i] ) bl = bm + 1;
				else last = bm, br = bm - 1;
			}
			P[last] = A[i], poz[i] = last;
		}
	}

	printf ( "%d\n", cnt );
	for ( i = N, last = 0; i >= 1 && cnt; --i )
		if ( poz[i] == cnt )
			P[++last] = A[i], --cnt;
	for ( i = last; i; --i )
		printf ( "%d ", P[i] );

	return 0;
}