Cod sursa(job #246778)

Utilizator ovy2906Popescu Ovidiu ovy2906 Data 21 ianuarie 2009 12:30:30
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.69 kb
#include<stdio.h>
int v[100001],b[100001],pre[100001],n,l=1;
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;
}