Cod sursa(job #641453)

Utilizator CBogdanCiobanu Bogdan CBogdan Data 28 noiembrie 2011 15:43:50
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#include<cstdio>
using namespace std;

int n,i,best,sol,P[30010],L[30010],V[30010],search(int);

void read(),solve(),afis(int);

int main()
{
	read();
	solve();
	
	return 0;
}

void read()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&n);
}

void solve()
{
	scanf("%d",&V[1]);
	L[1]=1;
	sol=1;
	for(i=2;i<=n;i++)
	{
		scanf("%d",&V[i]);
		best=search(V[i]);
		P[i]=L[best];
		L[best+1]=i;
		if(sol<best+1)sol=best+1;
	}
	printf("%d\n",sol);
	afis(L[sol]);
}


int search(int x)
{
	int pr=0,ult=sol,mij;
	while(pr<=ult)
	{
		mij=(pr+ult)/2;
		if(x>V[L[mij]] && x<=V[L[mij+1]])return mij;
		if(x>V[L[mij+1]]){pr=mij+1;}
		else {ult=mij-1;}
	}
	return sol;
}

void afis(int poz)
{
	if(P[poz])afis(P[poz]);
	printf("%d ",V[poz]);
}