Cod sursa(job #180383)

Utilizator sims_glAlexandru Simion sims_gl Data 16 aprilie 2008 22:57:39
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <stdio.h>
#include <vector>

using namespace std;

#define nm 100100
#define inf 2100000000

int n, a[nm], c[nm], v[nm], sol;
vector<int> d;

int bs(int val)
{
	int rez = 0;

	for (int step = (1 << 17); step; step /= 2)
		if (rez + step <= sol && v[rez + step] < val)
			rez += step;

	return rez;
}

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

	scanf("%d", &n);

	for (int i = 1; i <= n; ++i) {
		scanf("%d", &a[i]);

		int pos = bs(a[i]) + 1;

		v[pos] = a[i];
		c[i] = pos;

		if (sol < pos)
			sol = pos;
	}

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

	int last = inf;

	for (int i = n, j = sol; j; --j) {
		while (c[i] > j || a[i] >= last)
			--i;

		last = a[i];
		d.push_back(a[i]);
	}

	for (int i = d.size() - 1; i >= 0; --i)
		printf("%d ", d[i]);
	printf("\n");

	return 0;
}