Cod sursa(job #263678)

Utilizator za_wolfpalianos cristian za_wolf Data 20 februarie 2009 19:02:29
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include<stdio.h>
#define NMAX 100100
int w[NMAX],i,j,n,m,k,l,q,a,s,x[NMAX],y[NMAX],z[NMAX];
int cb(int s)
{
	int in,sf,m;
	in=1; sf=q;
	while (in<=sf)
	{
		m=(in+sf)/2;
		if (x[z[m]]>=s)
			sf=m-1;
		else
			in=m+1;
	}
	return sf;
}
int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&n);
	for (i=1;i<=n;i++)
		scanf("%d",&x[i]);
	x[0]=2000;
	z[i]=n+1;
	y[1]=1;
	z[1]=1;
	q=1;
	for (i=2;i<=n;i++)
	{
		k=cb(x[i]);
		if (k==0)
		{
			y[i]=1;
			if (x[z[1]]>x[i])
				z[1]=i;
		}
		else
		{
			y[i]=k+1;
			if (x[z[k+1]]>x[i])
				z[k+1]=i;
		}
		if (y[i]>q)
			q=y[i];

	}

	printf("%d\n",q);
	for (i=n;i>=1;i--)
		if (y[i]==q)
		{
			w[++w[0]]=x[i];
			q--;
		}
	for (i=w[0];i>=1;i--)
		printf("%d ",w[i]);
	printf("\n");
	return 0;
}