Cod sursa(job #303835)

Utilizator cristiprgPrigoana Cristian cristiprg Data 10 aprilie 2009 13:53:20
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>
#define DIM 100005
int n, v[DIM], p[DIM], M[DIM], L;
FILE *out = fopen("scmax.out", "w");

void afis(int i)
{
	if (p[i] != 0)
		afis(p[i]);

	if (p[i] != 0)
	fprintf(out, "%d ", v[p[i]]);
}


int max(int a, int b)
{
	if (a > b)
		return a;
	else
		return b;
}

int caut(int x)
{
	int p = 1, u = L, m = (p + u) / 2;

	while (p <= u)
	{
		if (v[M [ m - 1 ]] < x && v[M [m + 1]] >= x)
			return m;

		if (v[M [m + 1]] < x)
			p = m + 1, m = (p + u) / 2;

		else
			u = m - 1, m = (p + u) / 2;
	}

	return L;
}

void solve()
{
	int i, j;
	for (i = 1; i <= n; i++)
	{
		j = caut(v[i]);
		p[i] = M[j];
		if (j == L || v[i] < v[ M [ j + 1] ])
			M[j + 1] = i, L = max (L, j + 1);
	}
}



int main()
{
	FILE *f =fopen("scmax.in", "r");
	fscanf(f, "%d", &n);
	int i;
	for (i = 1; i <= n; i++)
		fscanf(f, "%d", &v[i]);
	fclose(f);

	solve();


	fprintf(out, "%d\n", L);
	int maxim = -1, ibun;
	for (i = 1; i <=n; i++)
		if (p[i] > maxim)
			maxim = p[i], ibun = i;
	afis(ibun);
	fprintf(out, "%d", v[M[L]]);
	fclose(out);
	return 0;

}