Cod sursa(job #175947)

Utilizator AlxCojocaru Alexandru Alx Data 10 aprilie 2008 16:53:22
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>
int n,a[100001],l[100001],best[100001],p[100001],nr;
int caut(int x)
{
    int st=0,sf=nr,m=(st+sf)/2;
    while (st<=sf)
    {
        if (a[l[m]]<x&&a[l[m+1]]>=x)
         return m;
        if (a[l[m+1]]<x)
        {
            st=m+1;
            m=(st+sf)/2;
        }
        else
        {
            sf=m-1;
            m=(st+sf)/2;
        }
    }
    return nr;
}
void afis(int x)
{
    if (p[x])
     afis(p[x]);
    printf("%d ",a[x]);
}
int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d",&n);
    int i,poz,max,pm;
    for (i=1;i<=n;i++)
        scanf("%d",&a[i]);
    l[1]=best[1]=1;
    nr=1;
    for (i=2;i<=n;i++)
    {
        poz=caut(a[i]);
        best[i]=poz+1;
        p[i]=l[poz];
        l[poz+1]=i;
        if (poz+1>nr)
         nr=poz+1;
    }
    max=best[1];
    pm=1;
    for (i=2;i<=n;i++)
     if (best[i]>max)
     {
         max=best[i];
         pm=i;
     }
    printf("%d\n",max);
    afis(pm);
    printf("\n");
    return 0;
}