Cod sursa(job #509060)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 10 decembrie 2010 11:26:28
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.7 kb
#include<stdio.h>

int v[100001],q[100001],p[100001],sol[100001],i,n,pos,l,poslmax;

int pune(int x,int st,int dr)
{
	int m=(st+dr)/2;
	
	if(st==dr)
	{
		q[st]=x;
		return st;
	}
	if(x<=q[m]) return pune(x,st,m);
	return pune(x,m+1,dr);
}

int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	
	scanf("%d",&n);
	for(i=0;i<n;i++) scanf("%d",&v[i]);
	
	l=0;
	for(i=0;i<n;i++)
	{
		pos=pune(v[i],0,l+1);
		p[i]=pos;
		if(pos>l) 
		{
			l=pos;
			poslmax=i;
		}
	}
	
	printf("%d\n",l);
	int posct=poslmax;
	for(i=l;i>=1;i--)
	{
		while (p[posct]!=i) posct--;
		sol[++sol[0]]=v[posct];
	}
	for(i=sol[0];i>0;i--) printf("%d ",sol[i]);
	
	return 0;
}