Cod sursa(job #212666)

Utilizator andyciupCiupan Andrei andyciup Data 6 octombrie 2008 10:52:27
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<stdio.h>

#define lg 100005

int n, i, x, d[lg], str[lg], rsp, v[lg], nr, sol[lg], ind, poz;
struct kkt { int x, y; } q[lg];

int caut(int val){
	int li = 0, ls = nr, x, gs;
	
	while (li <= ls){
		x = (li+ls) / 2;
		
		if (q[x].x < val){
			gs = x;
			li = x+1;
		}
		else
			ls = x-1;
	}
	
	
	if (gs == nr)
		nr ++;
	q[gs+1].x = val, q[gs+1].y = i;
	return gs+1;
}

int main()
{
	freopen("scmax.in", "rt", stdin);
	freopen("scmax.out", "wt", stdout);
	
	scanf("%d", &n);
	for (i = 1; i <= n; i ++)
		scanf("%d", &v[i]);
	
	q[0].x = -2000000000;
	for (i = 1; i <= n; i ++){
		x = caut(v[i]);
		
		d[i] = x;
		str[i] = q[x-1].y;
		
		if (d[i] > rsp){
			rsp = d[i];
			poz = i;
		}
	}
	
	printf("%d\n", rsp);
	
	sol[++ ind] = poz;
	for (; str[poz] > 0; poz = str[poz])
		sol[++ ind] = str[poz];
	for (i = ind; i; i --)
		printf("%d ", v[sol[i]]);
	printf("\n");
	
	return 0;
}