Cod sursa(job #338947)

Utilizator radu_cppRadu Voroneanu radu_cpp Data 7 august 2009 16:26:35
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <stdio.h>
#define MAXN 100001

int i,nr,m,x,n;
int a[MAXN],b[MAXN],c[MAXN];

int caut(int x)
{
	int mij,st,dr,rasp;
	st=0; dr=m; rasp=m;
	while (st<=dr)
	{
		mij=(st+dr) >> 1;
		if (c[mij]<x && c[mij+1]>=x)
		{
			rasp=mij;
			break;
		}
		else
			if (c[mij+1]<x)
				st=mij+1;
			else
				dr=mij-1;
	}
	return rasp;
}

int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&n);
	for (i=1; i<=n; i++)
		scanf("%d",&a[i]);
	c[1]=a[1]; b[1]=1;
	for (i=2; i<=n; i++)
	{
		x=caut(a[i]);
		b[i]=x+1;
		c[x+1]=a[i];
		if (m<x+1)	m=x+1;
	}
	printf("%d\n",m);
	nr=0;
	c[0]=2000000100;
	for (i=n; i>=1; i--)
		if (b[i]==m && a[i]<c[nr])
		{
			nr++;
			c[nr]=a[i];
			m--;
		}
	for (i=nr; i>=1; i--)
		printf("%d ",c[i]);
	fclose(stdin); fclose(stdout);
	return 0;
}