Cod sursa(job #396051)

Utilizator GotenAmza Catalin Goten Data 14 februarie 2010 13:57:43
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.69 kb
#include<stdio.h>
int a[100100],b[100100],sol[100100],p[100100];
int main()
{
	int n,i,st,dr,L=0,gasit,m;
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d",&n);
	for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(i=1;i<=n;i++)
	{
		st=0;
		dr=L;
		gasit=0;
		while(st<=dr&&!gasit)
		{
			m=(st+dr)>>1;
			if(a[b[m]]<a[i]&&(a[i]<a[b[m+1]]||m==L))
				gasit=1;
			else
				if(a[b[m]]>a[i])
					dr=m-1;
				else
					st=m+1;
		}
		if(gasit)
		{
			b[m+1]=i;
			p[i]=b[m];
			if(m==L)
				L++;
		}
	}
	i=b[L];
	while(i)
	{
		sol[++sol[0]]=a[i];
		i=p[i];
	}
	printf("%d\n",sol[0]);
	for(i=sol[0];i;i--)
		printf("%d ",sol[i]);
	return 0;
}