Cod sursa(job #189399)

Utilizator ProtomanAndrei Purice Protoman Data 14 mai 2008 12:42:33
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include <stdio.h>
#include <algorithm>
#define mx 100010
long rez;
long a[mx],loc[mx],v[mx],g[mx];

void search(long p, long u, long x)
{
	if (p>u)
		return;
	long m=(p+u)/2;
	if (v[m-1]<x && v[m]>=x)
		rez=m;
	else if (v[m]>x) 
		search(p,m-1,x);
		 else search(m+1,u,x);
}

int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	long m=1,n,max=-1;
	v[1]=LONG_MAX;
	scanf("%ld",&n);
	for (long i=1; i<=n; i++)
	{
		scanf("%ld",&a[i]);
		search(1,m,a[i]);
		v[rez]=a[i];
		loc[i]=rez;
		if (rez==m)
		{
			m++;
			v[m]=LONG_MAX;
		}
		if (rez>max)
			max=rez;
	}
	printf("%ld\n",max);
	for (long i=n; i; i--)
		if (loc[i]==max)
		{
			g[max]=a[i];
			max--;
		}
	for (long i=1; g[i]; i++)
		printf("%ld ",g[i]);
	fclose(stdin);
	fclose(stdout);
	return 0;
}