Cod sursa(job #890194)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 24 februarie 2013 21:49:24
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb

#include <cstdio>

const int MAX_SIZE(100001);

int n, length;
int v [MAX_SIZE];
int b [MAX_SIZE];
int p [MAX_SIZE];

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",length);
	for (int i(1) ; i <= length ; ++i)
		std::printf("%d ",b[i]);
	std::putchar('\n');
	std::fclose(stdout);
}

inline void greedy (void)
{
	int i, j, l, r, m;
	for (i = 1 ; i <= n ; ++i)
		if (v[i] > v[b[length]] || !length)
		{
			p[i] = b[length];
			++length;
			b[length] = i;
		}
		else
		{
			l = 1;
			r = length;
			m = (l + r) >> 1;
			while (l < r)
			{
				if (v[b[m]] < v[i])
					l = m + 1;
				else
					r = m;
				m = (l + r) >> 1;
			}
			if (v[b[m]] > v[i])
			{
				b[m] = i;
				p[i] = b[m - 1];
			}
		}
	for (i = b[length], j = length ; j ; --j, i = p[i])
		b[j] = v[i];
}

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