Cod sursa(job #302896)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 9 aprilie 2009 13:14:02
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define FIN "scmax.in"
#define FOUT "scmax.out"
#define Nmax 100010
#define Inf 0x3f3f3f3f


int v[Nmax],n,nr,poz[Nmax],lmax[Nmax];

inline int cautbin(int p, int u, int x)
{
	int mij,i,j;
	mij=(p+u)>>1;
	while(p<=u)
	{
		if (lmax[mij]>=x && lmax[mij-1]<x)
			 return mij;
		if (lmax[mij]<x)
		{
		    p=mij+1;
			mij=(p+u)>>1;
		}
		else
		{
			u=mij-1;
			mij=(p+u)>>1;
		}
	}
	return ++nr;
}

inline void scrie(int n, int nr)
{
	int i,j;
	if(nr>=1)
	{
		if (poz[n]==nr)
		{
			scrie(n-1,nr-1);
			printf("%d ",v[n]);
		}
		else
		{
			scrie(n-1,nr);
		}
	}
}
	

inline void solve()
{
	int i,j,l;
    for (i=1;i<=n;++i)
	{
		l=cautbin(1,nr,v[i]);
		lmax[l]=v[i];
		poz[i]=l;
	}
}



inline void citire()
{
   int i,j;
   freopen(FIN,"r",stdin);
   freopen(FOUT,"w",stdout);
   
   scanf("%d", &n);
   for (i=1;i<=n;++i)
         scanf("%d", &v[i]);
}   

int main()
{
	
	citire();
	solve();
	printf("%d\n", nr);
	scrie(n,nr);
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
}