Cod sursa(job #708056)

Utilizator valiro21Valentin Rosca valiro21 Data 6 martie 2012 12:55:24
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>
#define NMax 100021
#include <list>

using namespace std;

long n,m[NMax],v[NMax],L,j,N,val,pv[NMax],uu[NMax];
list<long> li;

long bsearch(long,long,long);

int main()
{
	freopen("scmax.in","rt",stdin);
	freopen("scmax.out","wt",stdout);
	
	scanf("%ld",&N);
	
	long ult=0;
	for(long i=1;i<=N;i++)
	{
		scanf("%ld",&v[i]);
		j=bsearch(1,L,v[i]);
		if(!(v[i]==m[j]))
			if(j==L+1)
				m[++L]=v[i],pv[i]=uu[L-1],uu[L]=i;
			else
				m[j]=v[i],pv[i]=uu[j-1],uu[j]=i;
	}
	
	printf("%ld\n",L);
	
	long x=uu[L];
	while(x)
	{
		li.push_front(v[x]);
		x=pv[x];
	}
	
	for(list<long>::iterator i=li.begin();i!=li.end();i++)
		printf("%ld ",*i);
	
	printf("\n");
	return 0;
}

long bsearch(long in,long fn,long val)
{
	long mid=(in+fn)/2;
	
	if(in>fn)
		return L+1;
	if(m[mid]>=val)
		if(m[mid-1]<val)
			return mid;
		else
			return bsearch(in,mid-1,val);
	else
		return bsearch(mid+1,fn,val);
}