Cod sursa(job #252653)

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

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

void afiseaza(int x)
{
    if (urm[x]) afiseaza(urm[x]);
    if (A[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]);
    maxt=1;
    M[1]=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;
        urm[i]=M[k-1];
        if (L>maxt)
        {
            maxt=L;
            pmax=i;
        }
    }
    printf("%d\n",maxt);
    afiseaza(pmax);

    return 0;
}