Cod sursa(job #641499)

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

int n,i,best,sol,V[100010],L[100010],P[100010],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);
	for(i=1;i<=n;i++)scanf("%d",V+i);
}

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

int search(int x)
{
	int p=1,u=sol,m;
	while(p<=u)
	{
		m=(p+u)/2;
		if(x>V[L[m]] && (x<=V[L[m+1]] || L[m+1]==0))return m;
		if(x<=V[L[m]])u=m-1;
		else          p=m+1;
	}
	return 0;
}
void afis(int poz)
{
	if(P[poz])afis(P[poz]);
	printf("%d ",V[poz]);
}