Cod sursa(job #303912)

Utilizator cristiprgPrigoana Cristian cristiprg Data 10 aprilie 2009 14:59:56
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 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]] < x)
			return m;

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

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


	}

	if (p == L && u == L - 1 && p != 1)
		return L;

//	if (u == -1 || p > u)
		return 0;

	printf("PULA MEA!\n");


}

void solve()
{
	v[0] = 1<<30;
	int i, j;
/*	L = 1;
	M[1] = 1;*/
	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(L);
	fprintf(out, "%d", v[M[L]]);
	fclose(out);
	return 0;

}