Cod sursa(job #513491)

Utilizator ZethpixZethpix Zethpix Data 15 decembrie 2010 22:53:34
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include <stdio.h>

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

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;
	last=2000000000;
	while(i>0)
	{
		if(P[i]==len&&last>A[i]) v[++nr]=A[i];
		last=A[i];
		len--;
		while(P[i]!=len&&i>0) i--;
	}

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

	return 0;
}