Cod sursa(job #180223)

Utilizator znakeuJurba Andrei znakeu Data 16 aprilie 2008 19:37:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <stdio.h>
#define MAXN 100005
#define MAXL MAXN*16


int n,v[MAXN];
int count[MAXN];
int poz[MAXN];
int val[MAXN],m;
int R[MAXN];

int sercibin(int k)  
{  
    int t=1,l=1,r=m;  
    while (l<r)  
    {  
        t=(l+r)/2;  
        if (k<=v[val[t]])  
           r=(l+r)/2;  
        else   
            l=(l+r)/2+1;          
    }     
    return r;  
} 


void  serciwtf()  
{  
    int t,i;  
	
    count[0]=0;  
	poz[0]=0;
    val[1]=1; m=1;
	
    for (i=2; i<=n; i++)  
    {  
        t=sercibin(v[i]);  
        if (v[val[t]]>=v[i])  
        {  
			val[t]=i;
            poz[i]=val[t-1];
			count[i]=t-1;			
        }  
        else  
        {  
            count[i]=t;
			poz[i]=val[t];
		    val[t+1]=i;  
            if (t+1>m)  
                m++;  
        }     
    }  
}  



void citire()
{
	char c[MAXL]; int i,j,x;
	
	scanf("%d",&n);
	
	fgets(c,100,stdin);
	fgets(c,MAXL,stdin);
	
	for (i=1,j=0; i<=n; ++i,++j)
	{
		x=0;
		while (c[j]>='0' && c[j]<='9')
			x=x*10+c[j++]-'0';
		v[i]=x;
	}	
}

void afisare()
{
	int max=0,j,i;
	for (i=n; i>0; i--)
		if (count[max]<count[i])
			max=i;
	
	printf("%d\n",count[max]+1);
	
	R[m]=v[val[m]];
	for (i=count[max],j=poz[max]; i; i--,j=poz[j])
		R[i]=v[j];
	
	printf("%d",R[1]);
	for (i=2; i<=m; i++)
		printf(" %d",R[i]);
	printf("\n");
}

int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
	
	citire();
	serciwtf();
	afisare();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}