Cod sursa(job #561623)

Utilizator blastoiseZ.Z.Daniel blastoise Data 20 martie 2011 21:10:18
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.78 kb
#include <string.h>
#include <stdio.h>

int d[100002],v[100002],sol[100002];
int i,size,pos,N;

int BS(int x,int L,int R)
{
	if(L<=R)
	{
		int M=(L+R)/2;
		if(x>d[M]) return BS(x,L,M-1);
		else
		if(x<d[M]) return BS(x,M+1,R);
		else return M;
	}
	else return L;
}

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

	scanf("%d",&N);
	for(i=1;i<=N;i++) scanf("%d",&v[i]);

	memset(d,0,sizeof(d));
	memset(sol,0,sizeof(sol));
	size=1;
	d[1]=v[N];
	sol[N]=1;

	for(i=N-1;i>0;i--)
	{
		pos=BS(v[i],1,size+1);
		if(pos>size) size=pos;
		if(d[pos]<v[i]) d[pos]=v[i];
		sol[i]=pos;
	}

	printf("%d\n",size);
	i=1;
	while(size&&i<=N)
	{
		while(sol[i]!=size&&i<=N) i++;
		printf("%d ",v[i]);
		i++;
		size--;
	}

	return 0;
}