Cod sursa(job #908826)

Utilizator taigi100Cazacu Robert taigi100 Data 10 martie 2013 00:11:45
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include<stdio.h>
#define max 100001
int A[max];
int tail[max],prev[max];
int Length,Max;
int celiIndex(int l,int r,int key)
{
	int m;
	while( (r-l)>1 )
	{
		m=(r-l)/2+l;
		(A[tail[m]] >= key ? r:l) = m;
	}
	return r;
}
int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);

	scanf("%d",&Length);
	
    for(int i=1;i<=Length;i++)  scanf("%d",&A[i]);
	tail[0]=0;
	prev[0]=-1;
	int len=1;
	for(int i=1;i<=Length;i++)
	{
		if(A[tail[0]]>A[i])
			tail[0]=i;
		else if(A[tail[len-1]]<A[i])
		{
			prev[i]=tail[len-1];
			tail[len++]=i;
		}
		else
		{
		int pos=celiIndex(-1,len-1,A[i]);
		prev[i]=tail[pos-1];
		tail[pos]=i;
		}
	}
	printf("%d\n",len-1);
	int j=1;
	for(int i=tail[len-1];i>0;i=prev[i])
		tail[j++]=A[i];
	for(int i=j-1;i>=1;i--)
		printf("%d ",tail[i]);
	return 0;
}