Cod sursa(job #305240)

Utilizator Omega91Nicodei Eduard Omega91 Data 16 aprilie 2009 18:58:44
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <cstdio>
#include <fstream>
using namespace std;
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;
	ifstream fin("scmax.in");
	freopen("scmax.out", "w", stdout);
	fin >> N;
	L = 1, M[0] = 0, M[1] = 1, P[1] = 0;
	fin >> X[1];
	for (i = 2; i <= N; ++i) {
		fin >> 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]; } while ((j = P[j]));
	for (; L; --L) printf("%d ", ans[L]);
	printf("\n");
	return 0;
}