Cod sursa(job #2244440)

Utilizator akumariaPatrascanu Andra-Maria akumaria Data 22 septembrie 2018 19:22:36
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <cstdio>

using namespace std;

void pr(int sir_init[],int pozs[], int i)
{
    if (pozs[i])
        pr(sir_init, pozs, pozs[i]);
    printf("%d ", sir_init[i]);
}

int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);

    int n, i, j, st, dr, m, nr = 1;

    scanf("%d", &n);
    int sir_init[n+2], best[n+2], maxs[n+2], pozs[n+2];
    for(i=1; i<=n; ++i)
        scanf("%d", &sir_init[i]);

    best[1] = maxs[1] = 1;
    maxs[0] = 0;

    for(i=2; i<=n; ++i)
    {
        st = 0;
        dr = nr;
        while (st <= dr)
        {
            m = (st+dr) / 2;
            if (sir_init[maxs[m]] < sir_init[i] && sir_init[maxs[m+1]] >= sir_init[i])
                break;
            if (sir_init[maxs[m+1]] < sir_init[i])
                st = m+1;
            else
                dr = m-1;
        }

        pozs[i] = maxs[m];
        maxs[m+1] = i;
        best[i] = m+1;
        if (nr < m+1)
            nr = m+1;
    }

    j = 1;
    for(i=2; i<=n; ++i)
        if(best[i] > best[j])
            j = i;

    printf("%d\n", best[j]);
    pr(sir_init, pozs, j);

    fclose(stdin);
    fclose(stdout);
    return 0;
}