Cod sursa(job #318715)

Utilizator DraStiKDragos Oprica DraStiK Data 29 mai 2009 07:38:38
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <stdio.h>
#define DIM 100005
int a[DIM],lung[DIM],prec[DIM];
int n,max,poz;
void read ()
{
	int i;
	scanf ("%d",&n);
	for (i=1; i<=n; ++i)
		scanf ("%d",&a[i]);
}
void print (int n)
{
	if (prec[n])
		print (prec[n]);
	printf ("%d ",a[n]);
}
int cbin (int st,int dr,int x)
{
	int mij;
	for ( ; st<=dr; )
	{
		mij=(st+dr)/2;
		if (a[lung[mij]]<a[x] && (a[lung[mij+1]]>=a[x] || mij+1>max))
			return mij;
		else if (a[lung[mij]]<a[x])
			st=mij+1;
		else
			dr=mij-1;
	}
	return 0;
}
void solve ()
{
	int i,j;
	for (i=1; i<=n; ++i)
	{
		j=cbin (1,max,i);
		prec[i]=lung[j];
		if (j==max || a[i]<a[lung[j+1]])
		{
			lung[j+1]=i;
			if (j+1>max)
			{
				max=j+1;
				poz=i;
			}
		}
	}
	printf ("%d\n",max);
	print (poz);
}
int main ()
{
	freopen ("scmax.in","r",stdin);
	freopen ("scmax.out","w",stdout);
	read ();
	solve ();
	return 0;
}