Cod sursa(job #539047)

Utilizator SadmannCornigeanu Calin Sadmann Data 22 februarie 2011 12:05:23
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>
#define NMAX 100001
int v[NMAX],best[NMAX],p[NMAX],L[NMAX],nr=1,n,maxim;
int i,j,poz;
FILE *in,*out;

int caut(int x)
{
    int p=0,u=nr,m;
    m=(p+u)>>1;
    while(p<=u)
    {
        if(v[L[m]]<x && v[L[m+1]]>=x)
            return m;
        else
            if(v[L[m+1]]<x)
            {
                p=m+1;
                m=(p+u)>>1;
            }
            else
            {
                u=m-1;
                m=(p+u)>>1;
            }
    }
    return nr;

}

void afis(int i)
{
    if(p[i]>0)
        afis(p[i]);
    fprintf(out,"%d ",v[i]);
}

int main()
{
    in=fopen("scmax.in","rt");
    out=fopen("scmax.out","wt");
    fscanf(in,"%d",&n);
    for(i=1;i<=n;i++)
        fscanf(in,"%d",&v[i]);
    best[1]=L[1]=1;
    for(i=2;i<=n;i++)
    {
        poz=caut(v[i]);
        p[i]=L[poz];
        best[i]=poz+1;
        L[poz+1]=i;
        if(nr<poz+1)
            nr=poz+1;
    }
    maxim=poz=0;
    for(i=1;i<=n;i++)
        if(maxim<best[i])
        {
            maxim=best[i];
            poz=i;
        }

    fprintf(out,"%d\n",maxim);
    afis(poz);
    return 0;
}