Cod sursa(job #221989)

Utilizator Mishu91Andrei Misarca Mishu91 Data 19 noiembrie 2008 10:24:59
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>

#define MAX_N 100005

int V[MAX_N], ant[MAX_N], L[MAX_N], P[MAX_N];
int N, nr;

inline int maxim(int a, int b)
{
    return (a > b)? a : b;
}

int find(int x)
{
    int log, i, lg;
    for(log = 1; log <= nr; log <<= 1);

    for(i = nr, lg = log; lg; lg >>= 1)
        if(i - lg >= 0 && V[P[i - lg + 1]] >= x)
            i -= lg;
    return i;
}

void afisare(int i)
{
    if(ant[i]) afisare(ant[i]);
    printf("%d ",V[i]);
}

void find_scmax()
{
    int max = 0, poz;
    P[0] = 0;
    L[1] = P[1] = 1;
    nr = 1;

    for(int i = 2; i <= N; ++i)
    {
        poz = find(V[i]);
        ant[i] = P[poz];
        L[i] = poz+1;
        P[poz + 1] = i;
        nr = maxim(nr, poz+1);
    }
    for(int i = 1; i <= N; ++i)
    {
        if(L[i] > max)
            max = L[i], poz = i;
    }

    printf("%d\n", max);

    afisare(poz);
}

int main()
{
    freopen("scmax.in","rt",stdin);
    freopen("scmax.out","wt",stdout);

    scanf("%d",&N);

    for(int i = 1; i <= N; ++i)
        scanf("%d",V+i);

    find_scmax();
}