Cod sursa(job #793940)

Utilizator MtkMarianHagrSnaf MtkMarian Data 4 octombrie 2012 19:57:25
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<cstdio>
#include<cmath>
using namespace std;

#define ll long long 
#define NMAX 100002

ll a[NMAX],c[NMAX],l[NMAX];
int size=1,k,m;

int cauta(ll c[],ll val,int l,int r)
{
	m=(l+r)/2;
	
	

	
	if(c[m-1]<val && val<=c[m])return m;
	else
		if(c[m]>val)cauta(c,val,l,m);
				else cauta(c,val,m+1,r);
	

}

int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);

	int n;

	scanf("%d",&n);
	

	for(int i=1;i<=n;++i)scanf("%lld",&a[i]);

	c[1]=a[1];
	l[1]=1;

	for(int i=2;i<=n;++i)
	{

		if(a[i]<=c[1])
		{
			c[1]=a[i];
			l[i]=1;
		}

		else 
			if(a[i]>c[size])
			{
			  ++size;
			  c[size]=a[i];
			  l[i]=size;

			}

			else
			{
				k=cauta(c,a[i],1,size);
				c[k]=a[i];
				l[i]=k;
			}

	}

	printf("%d\n",size);
	int sz=size;
	int j=0;
	ll b[NMAX];

	for(int i=n;i&&sz;--i)
		if(l[i]==sz)
		{
			++j;
			b[j]=a[i];			
			--sz;
		}

		for(int i=j;i;--i)printf("%lld ",b[i]);

	return 0;
}

/*
	for(int i=1;i<=size;++i)
	{
		printf( " %lld ",c[i]);
	}


	printf("\n");

	for(int i=1;i<=n;++i)
	{
		printf(" l[i]= %lld \t a[i]=%lld\t",l[i],a[i]);
	}

	printf("\n");
	*/