Cod sursa(job #289138)

Utilizator snaked31Stanica Andrei snaked31 Data 26 martie 2009 14:55:30
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <stdio.h>


#define nm 100010

int i, n, m, mx, sol, poz;
int v[nm], q[nm], p[nm];


void read()

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


int bs(int l, int r, int x)

{
	int mid = (l+r)/2;
	if (l > r)
		return l;
	if (q[mid] > x)
		return (bs(l, mid-1, x));
	if (q[mid] < x)
		return (bs(mid+1, r, x));
	else
		return mid;
}


void solve()

{
	q[1] = v[1];
	p[1] = 1;
	p[0] = 0;
	m = 1;
	mx = 0;

	for (i=2; i<=n; ++i)
	{
		poz = bs(1, m, v[i]);
		p[i] = p[poz-1] + 1;
		q[poz] = v[i];
		if (poz > m)
			m = poz;
		if (mx < m)
			mx = m;
	}
	sol = mx;
	for (i=n; i>0; --i)
	{
		if (p[i] == mx)
		{
			q[mx] = v[i];
			--mx;
		}
	}
}


void write()

{
	printf("%d\n", sol);
	for (i=1; i<=sol; ++i)
		printf("%d ", q[i]);
}

int main()

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

	read();
	solve();
	write();

	return 0;
}