Cod sursa(job #561624)

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

int i,N,A[100010],Q[100010],P[100010],len,pos,v[100010],nr;

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

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]);

	Q[1]=A[1];
	P[1]=1;
	len=1;

	for(i=2;i<=N;i++)
	{
		if(Q[len]<A[i])
		{
			Q[++len]=A[i];
			P[i]=len;
		}
		else
		{
			pos=BS(1,len,A[i]);
			Q[pos]=A[i];
			P[i]=pos;
		}
	}

	printf("%d\n",len);
	nr=0;
	i=N;
	while(i>0)
	{
		while(P[i]!=len&&i>0) i--;
		if(i>0)
		{
			len--;
			v[++nr]=A[i];
		}
	}

	for(i=nr;i>0;i--)
		printf("%d ",v[i]);
	printf("\n");

	return 0;
}