Cod sursa(job #289263)

Utilizator Omega91Nicodei Eduard Omega91 Data 26 martie 2009 17:13:43
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <cstdio>

const int NMAX = 100001;

inline int max(int a, int b) { return a > b ? a : b; }

int main()
{
	int N, L, M[NMAX] = {}, X[NMAX], P[NMAX], ans[NMAX];
	int i, j, step;
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);
	scanf("%d\n", &N);
	L = 1;
	M[0] = 0;
	M[1] = 1;
	P[1] = 0;
	scanf("%d ", X + 1);
	for (i = 2; i <= N; ++i) {
		scanf("%d ", X + i);
		
		//BS
		for (step = 1; step <= L; step <<= 1);
		for (j = 0; step; step >>= 1)
			if (j + step <= L)
				if ( X[M[j + step]] < X[i] )
					j += step;
		
		P[i] = M[j];
		if (X[i] < X[M[j + 1]] || j == L) {
			M[j + 1] = i;
			L = max(L, j + 1);
		}
	}
	printf("%d\n", L);
	j = M[L];
	step = 1;
	do {
		ans[step++] = X[j];
		j = P[j];
	} while (j);
	for (i = L; i >= 1; --i)
		printf("%d ", ans[i]);
	printf("\n");
	return 0;
}