Cod sursa(job #553163)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 13 martie 2011 18:09:47
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#include <algorithm>

#define maxn 100050
#define mid ((st + dr) >> 1)
#define fs (mid << 1)
#define fd ((mid<<1)+1)

using namespace std;

int D[maxn], lst[maxn], h, res, ind, A[maxn], B[maxn], up[maxn], k, N, arb[4 * maxn], sol[4 * maxn];
void update (int nod, int st, int dr, int val, int nr, int poz)
{
	if (st == dr) {
		
		if (arb[nod] < nr) {
			arb[nod] = nr;
			sol[nod] = poz;
		}	
		return ;
	}
	
	if (val <= mid)
		update (fs, st, mid, val, nr, poz);
	if (val > mid)
		update (fd, mid + 1, dr, val, nr, poz);
	if (arb[fs] > arb[fd]) sol[nod] = sol[fs];
	else sol[nod] = sol[fd];
	arb[nod] = max (arb[fs], arb[fd]);
}
void query (int nod, int st, int dr, int b)
{
	if (b >= dr || st == dr) {
		if (res < arb[nod]) {
			res = arb[nod];
			ind = sol[nod];
		}
		return ;
	}
	query (fs, st, mid, b);
	if (b > mid) query (fd, mid + 1, dr, b);
}
int main ()
{

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

	scanf ("%d\n", &N);
	
	int i, ord;

	for (i = 1; i <= N; i++)
	{
		scanf ("%d", &A[i]);
		B[i] = A[i];
	}
	sort (A + 1, A + N + 1);
	k = unique (A + 1, A + N + 1) - A;
	k -= 1;

	for (i = 1; i <= N; i++) {

		ord = lower_bound (A + 1, A + k + 1, B[i]) - A;
		res = 0;
		ind = 0;
//		printf ("%d\n", ord);
		query (1, 1, k, ord - 1);
		
		D[i] = res + 1;
		up[i] = ind;
		
		update (1, 1, k, ord, D[i], i);
	}
	int mx, pz = 1;
	mx = 0;
	
	for (i = 1; i <= N; i++)
		if (mx < D[i])
			mx = D[i], pz = i;
	printf ("%d\n", mx);	
	for (i = pz; i; i = up[i]) 
		lst[++h] = B[i];
	
	for (; h >= 2; h--)
		printf ("%d ", lst[h]);
	printf ("%d\n", lst[1]);
	return 0;
}