Cod sursa(job #210081)

Utilizator vlad_popaVlad Popa vlad_popa Data 26 septembrie 2008 13:52:24
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <cstdio>

#define MAXN 100001

int N;
int V[MAXN];
int S[MAXN], L[MAXN];
int sol[MAXN];

void read (){
	scanf ("%d\n", &N);

	for (int i = 1; i <= N; ++ i) scanf (" %d", V + i);
}

int binsearch (int val, int lim){
	int i, step = (1<<17);

	for (i = 0; step; step >>= 1)
		if (i + step <= lim && S[i + step] < val) i += step;

	return i;
}

void solve (){
    int k, lim, fnd, t;

	S[1] = V[1], L[1] = 1;

	for (lim = 1, k = 2; k <= N; ++ k){
		fnd = binsearch (V[k], lim) + 1;
		S[fnd] = V[k];
		if (fnd > lim) ++ lim;
		L[k] = fnd;
	}

	printf ("%d\n", lim); t = lim;

	for (int i = N; i >= 1; -- i)
		if (L[i] == t) sol[t] = V[i], --t;
	for (int i = 1; i <= lim; ++ i) printf ("%d ", sol[i]);
	printf ("\n");
}

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

	read ();
	solve ();

	return 0;
}