Cod sursa(job #252563)

Utilizator RobybrasovRobert Hangu Robybrasov Data 4 februarie 2009 16:43:24
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <cstdio>
#define N 100001

int A[N],urm[N],C[N],M[N],n,i,j,L,maxt,pmax,step,k;

void afiseaza(int x)
{
    if (urm[x]) afiseaza(urm[x]);
    printf("%d ",A[x]);
}

int main()
{
	freopen("scmax.in","r",stdin);
	freopen("scmax.out","w",stdout);
    scanf("%d\n",&n);
    for (i=1; i<=n; i++) scanf("%d",&A[i]);
    C[1]=1; maxt=1;
    M[1]=A[1]; L=1;
    for (i=2; i<=n; i++)
    {
        for (step=1; step<L; step<<=1);
        for (k=0; step; step>>=1)
            if (k+step<=L && A[M[k+step]]<A[i])
                k+=step;
        k++;
        L=k;
        M[k]=i;
        C[i]=k;
        urm[i]=M[k-1];
        if (k>maxt)
        {
            maxt=k;
            pmax=i;
        }
    }
    printf("%d\n",maxt);
    afiseaza(pmax);

    return 0;
}