Cod sursa(job #380302)

Utilizator PavelRazvanPavel Razvan PavelRazvan Data 5 ianuarie 2010 17:28:52
Problema Subsir crescator maximal Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<stdio.h>
#define DIM 100003
struct lungime
{
    int x,p;
} lung[DIM];
int n,a[DIM],max2,prec[DIM];
void read ()
{
	int i;
	scanf("%d",&n);
	for(i=1;i<=n;++i)
		scanf("%d",&a[i]);
}
void solve ()
{
	int i,st,dr,mij,ind,max;
	for(i=1;i<=n;++i)
	{
	    lung[i].x=1<<30;
	    max=0;
	    st=1,dr=max2;
	    while(st<=dr)
	    {
	        mij=(st+dr)/2;
	        if(lung[mij].x<a[i])
	        {
                max=mij;
                ind=lung[mij].p;
                st=mij+1;
	        }
	        else
                dr=mij-1;
	    }
	    prec[i]=ind;
	    if(max2<max+1)
            max2=max+1;
	    if(lung[max+1].x>a[i])
	    {
	        lung[max+1].x=a[i];
	        lung[max+1].p=i;
	    }
	}
}
void show ()
{
	int i,b[DIM],ind;
	printf("%d\n",max2);
	ind=lung[max2].p;
	for(i=max2;i>0;--i,ind=prec[ind])
        b[i]=a[ind];
	for(i=1;i<=max2;++i)
	printf("%d ",b[i]);

}
int main ()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	read ();
    solve ();
    show ();
    return 0;
}