Cod sursa(job #701536)

Utilizator netedu_andreiFII Andrei Netedu netedu_andrei Data 1 martie 2012 16:24:45
Problema Subsir crescator maximal Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include<stdio.h>
#define nre 100001 

long a[nre],lg[nre],maxe[nre],p[nre],af[nre],maxi,i,poz,nrsub,n,max,maxp;
long bin(long nr)
{
	long x,y,m;
	x=0; y=nrsub; m=(x+y)/2;
	while (x<y)
	{
		if(a[lg[m]]<nr && a[lg[m+1]]>=nr) return m;
		else if(a[lg[m]]>nr) x=m+1,m=(x+y)/2;
		else y=m-1,m=(x+y)/2;
	}
	return nrsub;
}
int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%ld",&n);
	for(i=1;i<=n;i++)
		scanf("%ld",&a[i]);
	lg[1]=1,maxe[1]=1,nrsub=1; 
	for(i=2;i<=n;i++)
	{
		poz=bin(a[i]);
		lg[poz+1]=i;
		maxe[i]=poz+1;
		p[i]=lg[poz];
		if(poz==nrsub) nrsub++;
		if(maxe[i]>max)
		{
			max=maxe[i];
			maxp=i;
		}
	}
	printf("%ld\n",max);
	maxi=max;
	while(max>0)
	{
		af[max]=a[maxp];
		maxp=p[maxp];
		max--;
	}
	for(i=1;i<=maxi;i++) printf("%ld ",af[i]);
	return 0;
}