Cod sursa(job #543822)

Utilizator Rares95Rares Arnautu Rares95 Data 28 februarie 2011 17:22:37
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include <cstdio>
#include <cstdlib>
#define mare 0x3fffffff
using namespace std;
typedef int vector [100001];

vector v, p, q;
int *s, n, nq;

void citire()
{	freopen ("scmax.in", "r", stdin); freopen ("scmax.out", "w", stdout);
	scanf ("%d", &n); for (int i = 1; i <= n; ++i) scanf ("%d", &v[i]);
}

int caut_bin (int k, int x, int y)
{	int mij = (x + y) / 2;
	if (x == y)
		{	if (y > nq) q[++nq + 1] = mare;
			q[x] = k;
			return x;
		}
		else 
			if (k <= q[mij]) return caut_bin (k, x, mij);
				else return caut_bin (k, mij+1, y);
}

void creare_pq()
{	nq = 0;
	q[1] = mare;
	for (int i = 1; i <= n; ++i)
		p[i] = caut_bin (v[i], 1, nq+1);
}

void caut_sol()
{	int i, k = n;
	s = (int *) calloc (nq + 1, sizeof(int));
	for (i = nq; i; --i)
		{	while (p[k] != i) --k;
			*(s + i) = v[k];
		}
}

void scriu_sol()
{	printf ("%d\n", nq);
	for (int i = 1; i <= nq; ++i)
		printf ("%d ", *(s+i));
	printf ("\n");
}

int main()
{	citire();
	creare_pq();
	caut_sol();
	scriu_sol();
	return 0;
}