Cod sursa(job #314653)

Utilizator irene_mFMI Irina Iancu irene_m Data 12 mai 2009 13:06:44
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <stdio.h>
#define MaxN 100009

int a[MaxN],best[MaxN],p[MaxN],L[MaxN],k,max,nr,poz,n;

void cit()
{
	int i;
	freopen("scmax.in","r",stdin);
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
}

int caut(int x)
{
	int st=0,dr=nr,m=(st+dr)/2;
	while(st<=dr)
	{
		if(a[L[m]]< x &&  a[L[m+1]]>=x) 
			return m;   
		else
			if(a[L[m+1]]<x)
			{
				st=m+1; 
				m=(st+dr)/2;
			}
			else
			{
				dr=m-1;
				m=(st+dr)/2;
			}
	}
	return nr;
}
	
void rez()
{
	int i;
	for(i=2;i<=n;i++)
	{
		poz=caut(a[i]);
		p[i]=L[poz];
		best[i]=poz+1;
		L[poz+1]=i;
		if(nr<poz+1)
			nr=poz+1;
	}
}

void maxim()
{
	int i;
	poz=0;   
	for(i=1;i<=n;i++)   
		if(max<best[i])   
		{   
			max=best[i]; 
			poz=i;   
		}
}		
	
void afis(int i)
{
	if(p[i]>0)
		afis(p[i]);
	printf("%d ",a[i]);
}

int main()
{
	cit();
	freopen("scmax.out","w",stdout);
	rez();
	maxim();
	printf("%d\n",max);
	afis(poz);
	return 0;
}