Cod sursa(job #221966)

Utilizator Mishu91Andrei Misarca Mishu91 Data 19 noiembrie 2008 09:44:52
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 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 li = 0, lf = nr, m;
    while(li <= lf)
    {
        m = (li + lf) >> 1;

        if(V[P[m]] < x && V[P[m+1]] >= x) return m;
        if(V[P[m]] > x) lf = m - 1;
        else li = m + 1;
    }
    return nr;
}

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

void find_scmax()
{
    P[0] = 0;
    L[1] = P[1] = 1;
    nr = 1;

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

    int max = 0, poz;
    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();
}