Cod sursa(job #665111)

Utilizator matei_cChristescu Matei matei_c Data 21 ianuarie 2012 17:48:39
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.76 kb
#include<cstdio>

const int MAX_N = 100001 ;

int n, m;
int v[MAX_N];
int aux[MAX_N];
int parinte[MAX_N];

int caut(int x,int st,int dr)
{
	int sol=dr+1;
	while(st<=dr)
	{
		int mij = (st+dr)/2;
		if(x<=v[aux[mij]])
		{	
			dr=mij-1;
			sol=mij;
		}	
		else
			st=mij+1;
	}	
	return sol;
}

void Reconst(int pos) {
	if (parinte[pos] > 0) {
		Reconst(parinte[pos]);
	}
	printf("%d ", v[pos]);
}

int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
		scanf("%d",&v[i]);
	aux[1]=1;
	m = 1;
	for(int i=2;i<=n;++i)
	{
		int x = caut(v[i],1,m);
		if (x > m) {
			m = x;
		}
		aux[x]=i;
		parinte[i]=aux[x-1];
	}	
	printf("%d\n",m);
	Reconst(aux[m]);
	return 0;
}