Cod sursa(job #176168)

Utilizator M@2Te4iMatei Misarca M@2Te4i Data 10 aprilie 2008 20:13:34
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>
#define vv 100003
int n, v[vv], best[vv], p[vv], maxim, k, l[vv], nr;

void afisare(int i)
{
    if (p[i]>0)
        afisare(p[i]);
    printf("%d ",v[i]);
}

int caut(int x)
{
    int p, u, m;
    p=0;
    u=nr;
    m=(p+u)/2;
    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)/2;
        }
        else
        {
            u=m-1;
            m=(p+u)/2;
        }
    }
    return nr;
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    int poz;
    nr = 1;
    scanf("%d",&n);
    for (int i=1; i<=n; i++)
        scanf("%d", &v[i]);
    best[1]=l[1]=1;
    l[0]=0;
    for (int 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=0;
    poz=0;
    for (int i=1; i<=n; i++)
        if (maxim<best[i])
        {
            maxim=best[i];
            poz=i;
        }
    printf("%d\n",maxim);
    afisare(poz);
    return 0;
}