Cod sursa(job #244597)

Utilizator P1gl3TGilca Mircea Alexandru P1gl3T Data 15 ianuarie 2009 16:44:35
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.74 kb
#include<stdio.h>
int v[100001],b[100001],pre[100001],n,l=1;
// l lungimea maxima gasita pana la pasul curent

int search(int x)
{
	int p=1,u=l,m;
	while(p<u)
	{
		m=(p+u)/2;
		if(v[x]<v[b[m]])
			u=m;
		else
			p=m+1;
	}
	if(v[b[p]]<v[x]) return 0;
	return p;
}

void scrie(int i){
	if(pre[i]) scrie(pre[i]);
	printf("%d ",v[i]);
}

int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	int i,poz;
	scanf("%d",&n);
	for(i=1;i<=n;++i) scanf("%d",&v[i]);
	b[1]=1;
	for(i=2;i<=n;++i)
	{
		poz=search(i);
		if(poz==0){ 
			pre[i]=b[l];
			b[++l]=i; 
		}
		else{ 
			b[poz]=i;
			pre[i]=b[poz-1];
		}
	}
	printf("%d\n",l);
	if(l>1) scrie(pre[b[l]]);
	printf("%d\n",v[b[l]]);
	return 0;
}