Cod sursa(job #758837)

Utilizator MarquiseMarquise Marquise Data 16 iunie 2012 13:22:49
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <stdio.h>

#define NMAX 100005
#define INF 2000000005

int v[NMAX], p[NMAX], q[NMAX], N, s[NMAX];
int NR;


int insert(int val, int st, int dr)
{

	int m;

	m = ( st + dr) / 2;

	if ( st == dr)
	{
		if ( dr > NR )
			q[++NR + 1] = INF;
		q[st] = val ;
		return st;
	}
	else
		if ( val <= q[m] )
			return insert(val, st, m);
		else
			return insert(val, m + 1, dr);
}


void build()
{
	int i;

	q[1] = INF;

	for ( i = 1; i <= N; i++)
		p[i] = insert(v[i], 1, NR + 1);

}

void solution()
{
	int i, k;

	for ( k = N, i = NR; i; i--)
	{
		while  ( p[k] != i)
			k--;
		s[i] = v[k];
	}

	printf("%d\n", NR);

	for ( i = 1; i <= NR; i++)
		printf("%d ", s[i]);

	printf("\n");
}

int main()
{
	int i;

	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);

	scanf("%d", &N);
	for ( i = 1; i <= N; i++)
		scanf("%d", &v[i]);

	build();
	solution();

	return 0;
}