Cod sursa(job #2554866)

Utilizator s.gabi7Dumitrescu Daniel s.gabi7 Data 23 februarie 2020 14:39:53
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <stdio.h>
#define NMAX 100001
int n, v[NMAX], best[NMAX], p[NMAX], maxim, k, L[NMAX], nr;

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

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

int main (void) {
    freopen ("scmax.in", "r", stdin); freopen ("scmax.out", "w", stdout);
    int i, j, poz;
    nr=1;

    scanf ("%d", &n);
    for (i=1; i<=n; i++)
        scanf ("%d", v+i);
    best[1]=L[1]=1, L[0]=0;

    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=0, poz=0;

    for (i=1; i<=n; i++)
        if (maxim<best[i])
            maxim=best[i], poz=i;
    printf ("%d\n", maxim);
    af(poz);
    return 0;
}