Cod sursa(job #398806)

Utilizator socheoSorodoc Ionut socheo Data 19 februarie 2010 13:51:02
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.72 kb
#include<stdio.h>
long v[100005],q[100005],p[100005],n,i,x,l;
int cauta(long val,int low,int hi)
{int mid=(low+hi)/2;
	if(hi==low)
		return hi;
	if(val<q[mid])
		return cauta(val,low,mid);
	return cauta(val,mid+1,hi);
}
int main()
{	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%ld",&n);
	for(i=1;i<=n;i++)
		scanf("%ld",&v[i]);
	long max=-1;
	for(i=1;i<=n;i++)
	{	if(v[i]>max)
		{	max=v[i];
			q[++l]=max;
			p[i]=l;
		}
		else
			{ 	x=cauta(v[i],1,l);
				q[x]=v[i];
				p[i]=x;
				if(x==l)
					max=v[i];
			}
	}
	long nr=l;
	for(i=n;nr>=1;i--)
		if(p[i]==nr)
			{ q[nr]=v[i];
			  nr--;
			}
	printf("%ld\n",l);
	for(i=1;i<=l;i++)
		printf("%ld ",q[i]);
return 0; 
}