Cod sursa(job #1092873)

Utilizator pulseOvidiu Giorgi pulse Data 27 ianuarie 2014 15:14:21
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>

using namespace std;

#define NMAX 100010

int n, k, nr, maxim;
int v[NMAX], l[NMAX], best[NMAX], p[NMAX];

void ReadData ()
{
	scanf ("%d", &n);
	for (int i = 1; i <= n; ++i)
		scanf ("%d", v + i);
	best[1] = l[1] = 1;
	l[0] = 0;
}

int Search (int x)
{
	int first, last, mid;
	first = 0;
	last = nr;
	mid = (first + last) / 2;
	while (first <= last)
	{
		if (v[l[mid]] < x && v[l[mid + 1]] >= x) return mid;
		else if (v[l[mid + 1]] < x)
		{
			first = mid + 1;
			mid = (first + last) / 2;
		}
		else
		{
			last = mid - 1;
			mid = (first + last) / 2;
		}
	}
	return nr;
}

void WriteData (int i)
{
	if (p[i] > 0) WriteData (p[i]);
	printf ("%d ", v[i]);
}

int main ()
{
	freopen ("scmax.in", "r", stdin);
	freopen ("scmax.out", "w", stdout);
	int i, j, poz;
	ReadData ();
	for (i = 2; i <= n; ++i)
	{
		poz = Search (v[i]);
		p[i] = l[poz];
		best[i] = poz + 1;
		l[poz + 1] = i;
		if (nr < poz + 1)
			nr = poz + 1;
	}
	maxim = poz = -1;
	for (int i = 1; i <= n; ++i)
	{
		if (best[i] > maxim)
		{
			maxim = best[i];
			poz = i;
		}
	}
	printf ("%d\n", maxim);
	WriteData (poz);
	return 0;
}