Cod sursa(job #333032)

Utilizator crisojogcristian ojog crisojog Data 21 iulie 2009 12:05:12
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include<stdio.h>
long n,i,v[100010],q[100010],p[100010],k,lmax,pr[100010];
void read()
{
	scanf("%ld",&n);
	for(i=1;i<=n;++i) scanf("%ld",&v[i]);
}
long cautbin(long n,long a)
{
	long st, dr, m, u=0;  
    st=1;dr=n;  
    while(st<=dr)  
    {  
        m=(st+dr)/2;  
        if(a<=q[m])   
        {  
            u=m;  
            dr=m-1;  
        }  
        else st=m+1;  
    }  
    return u;  
}
void print()
{
	lmax=k; long t=0;
	for(i=n;i>=1;--i)
	{
		if(p[i]==lmax)
			pr[++t]=v[i],lmax--;
	}
	printf("%ld\n",k);
	for(i=t;i>=1;--i)
		printf("%ld ",pr[i]);
}
int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	read();
	q[1]=v[1];
	p[1]=1;
	k=1;
	for(i=2;i<=n;++i)
	{
		p[i]=cautbin(k,v[i]);
		if(p[i]==0) k++,p[i]=k;
		q[p[i]]=v[i];
	}
	print();
	
	return 0;
}