Cod sursa(job #903376)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 1 martie 2013 20:17:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb

#include <cstdio>

const int MAX_SIZE(100001);

int v [MAX_SIZE];
int pred [MAX_SIZE];
int b [MAX_SIZE];
int n, l;

inline void read (void)
{
	std::freopen("scmax.in","r",stdin);
	std::scanf("%d\n",&n);
	for (int i(1) ; i <= n ; ++i)
		std::scanf("%d",&v[i]);
	std::fclose(stdin);
}

inline void print (void)
{
	std::freopen("scmax.out","w",stdout);
	std::printf("%d\n",l);
	for (int i(1) ; i <= l ; ++i)
		std::printf("%d ",b[i]);
	std::putchar('\n');
	std::fclose(stdout);
}

inline void dynamic (void)
{
	int i, j, middle, left, right;
	b[1] = 1;
	l = 1;
	for (i = 2 ; i <= n; ++i)
	{
		if (v[i] > v[b[l]])
		{
			++l;
			b[l] = i;
			pred[i] = b[l - 1];
			continue;
		}
		left = 1;
		right = l;
		middle = (left + right) >> 1;
		while (left < right)
		{
			if (v[b[middle]] < v[i])
				left = middle + 1;
			else
				right = middle;
			middle = (left + right) >> 1;
		}
		if (v[b[middle]] > v[i])
		{
			b[middle] = i;
			pred[i] = b[middle - 1];
		}
	}
	for (j = l, i = b[l] ; i ; i = pred[i], --j)
		b[j] = v[i];
}

int main (void)
{
	read();
	dynamic();
	print();
	return 0;
}