Cod sursa(job #513231)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 15 decembrie 2010 15:33:18
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<string.h>
#include<stdlib.h>
#include<stdio.h>

int max,maxx,a[100000],b[100000],c[100000],m,i,j,n,nr,q,sol[100000];



int search(int st,int dr,int x)
{
	
	if (st==dr) return st;
	
	m=(st+dr)/2;
	
	if (x>b[m]) return search(m+1,dr,x);
		else return search(st,m,x);
}

int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	
	scanf("%d",&n);
	for (i=1;i<=n;i++)
		scanf("%d",&a[i]);
	
	memset(b,sizeof(b),0);
	memset(c,sizeof(c),0);
	
	max=0;
	
	for (i=1;i<=n;i++)
	{
		q=1;
		q=search(1,max+1,a[i]);
		
		b[q]=a[i];
		c[i]=q;
		
		if (q>max) max=q;
	}
	
	sol[max+1]=2000000001;
	maxx=max;
	
	printf("%d\n",max);
	for (i=n;i>=1;i--)
		if (c[i]==max&&a[i]<sol[max+1])
		{
			sol[max]=a[i];
			max--;
		}
		
	for (i=1;i<=maxx;i++)
		printf("%d ",sol[i]);
		
	printf("\n");
	
	return 0;
}