Cod sursa(job #391430)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 5 februarie 2010 17:46:52
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>
#define DIM 100005
int n,b[DIM],vf,a[DIM],cut;
void solve (int poz)
{

	int st=1,dr=vf,mij,max=0;
	while(st<=dr)
    {
        mij=(st+dr)/2;
        if(a[b[mij]]<a[poz])
        {
            max=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    if(max==vf)
        b[++vf]=poz;
    else if(a[b[max+1]]>a[poz])
        b[max+1]=poz;
}
void sol_construct (int poz)
{

	int st=cut,dr=vf-1,mij,max;
	while(st<=dr)
    {
        mij=(st+dr)/2;
        if(a[b[mij]]<=a[poz])
        {
            max=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
    }
    if(max==cut)// && a[b[max]]>a[poz])
        b[--cut]=poz;
    else if(a[b[max]]<a[poz])
        b[cut=max]=poz;
}
int main ()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	int i;
	scanf("%d",&n);
	for(i=1;i<=n;++i)
	{
		scanf("%d",&a[i]);
		solve (i);
	}
	cut=1;
	if(vf!=n)
        for(i=b[vf]-1;i>0;--i)
            if(a[b[vf]]>a[i])
                sol_construct (i);
	printf("%d\n",vf);
	for(i=cut;i<=vf;++i)
        printf("%d ",a[b[i]]);
    return 0;
}