Cod sursa(job #526672)

Utilizator proflaurianPanaete Adrian proflaurian Data 29 ianuarie 2011 10:28:55
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include<stdio.h>
#define N 100001
int 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("%d",&n);
	M=1;y[1]=2000000001;
	for(i=1;i<=n;i++)
	{
		scanf("%d",&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]=P[x[dr]];
					L[i]=dr;
					x[dr]=a[i];
					y[dr]=i;
				}
			}
	}
	for(i=M;i>=1;i--)
	{
		x[i-1]=P[x[i]];
		y[i]=a[x[i]];
	}
	printf("%d\n",M);
	for(i=1;i<=M;i++)
		printf("%d ",y[i]);
	
}