Cod sursa(job #752065)

Utilizator dan.paulaDan Paula dan.paula Data 27 mai 2012 18:19:16
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include<stdio.h>
#define MAX 100005

long dim,n,V[MAX],P[MAX],L[MAX],SOL[MAX];

long Binary_Search(long x)
{
	long st=1,dr=dim,mj;
	while(st<=dr)
	{
		mj = (st + dr) >> 1;
		if(x <= V[L[mj]]) dr = mj - 1;
		else st = mj + 1;
	}
	return dr;
}


int main()
{
	freopen("scmax.in","rt",stdin);
	freopen("scmax.out","wt",stdout);
	scanf("%ld",&n);long i,j;
	
	for(i=1;i<=n;i++) scanf("%ld",V+i);
	P[1]=L[1]=dim=0;
	for(i=1;i<=n;i++) 
	{
		if(V[i] > V[L[dim]]) { L[++dim] = i;P[i]=L[dim-1];}
		else 
		{
			j = Binary_Search(V[i]);
			P[i] = L[j];
			if(j == dim || V[i] < V[L[j+1]])
			{
				L[j+1] = i;
				dim = dim<j+1?j+1:dim;
			}
		}
	}
	printf("%ld\n",dim);
	long x = L[dim];
	while(x)
	{
		SOL[++SOL[0]] = V[x];
		x = P[x];
	}
	for(i=SOL[0];i>=1;i--) printf("%ld ",SOL[i])
	return 0;
}