Cod sursa(job #181612)

Utilizator DorinOltean Dorin Dorin Data 18 aprilie 2008 17:27:02
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
# include <stdio.h>

# define input "scmax.in"
# define output "scmax.out"

# define max 200001

int a[max],v[max];
int i, n, p, sz;
int ant[max], val[max];
int sol[max];

int search(int x)
{
	int pow,pos;
	for(pow = 1; pow <= sz; pow<<=1);
	for(pos = 0; pow; pow>>=1 )
			if(pos+pow <= sz && v[pos+pow] < x) pos+=pow;

	return pos;
}

int main()
{
	freopen(input,"r", stdin);
	freopen(output,"w", stdout);

	scanf("%d ",&n);
	for(i = 1; i <= n; i++)
	{
		scanf("%d",&a[i]);
		if(a[i] > v[sz])
		{
			 v[++sz] = a[i];
			 val[sz] = i;
			 ant[i] = val[sz-1];
		}
		if(a[i] == v[sz]) continue;
		p = search(a[i]) + 1;
		v[p] = a[i];
		ant[i] = val[p-1];
		val[p] = i;
	}


	printf("%d\n",sz);

	p = sz;
	for(i = val[sz]; i; i=ant[i])
		sol[p--] = a[i];
	for(i = 1; i <= sz; i++)
		printf("%d ",sol[i]);
    
    return 0;
}