Cod sursa(job #526679)

Utilizator proflaurianPanaete Adrian proflaurian Data 29 ianuarie 2011 10:46:31
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.74 kb
#include<stdio.h>
#define N 100001
long long n,M,st,dr,mi,a[N],x[N],y[N],P[N],L[N],i;
int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%lld",&n);
	M=1;y[1]=2000000001;
	for(i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
		if(a[i]<y[1]){L[i]=1;P[i]=0;x[1]=i;y[1]=a[i];}
		else
			if(a[i]>y[M]){M++;L[i]=M;P[i]=x[M-1];x[M]=i;y[M]=a[i];}
			else
			{
				st=1;dr=M;
				while(dr>st+1)
				{
					mi=(st+dr)/2;
					if(a[i]>y[mi])st=mi;
					else dr=mi;
				}
				if(a[i]<y[dr])
				{
					P[i]=x[dr-1];
					L[i]=dr;
					x[dr]=i;
					y[dr]=a[i];
				}
			}
	}
	for(i=M;i>=1;i--)
	{
		x[i-1]=P[x[i]];
		y[i]=a[x[i]];
	}
	printf("%lld\n",M);
	for(i=1;i<=M;i++)
		printf("%lld ",y[i]);
	
}