Cod sursa(job #2503168)

Utilizator cristina-criCristina cristina-cri Data 2 decembrie 2019 16:59:16
Problema Subsir crescator maximal Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.03 kb
#include <cstdio>

using namespace std;
int n, a[100005], el[100005], pozitii[100005], nrEl, poz;
int dp[100005], imax;

int caut_bin(int x, int lg)
{

    int i;
    for(i=nrEl; lg!=0; lg>>=1)
        if(i - lg >= 0 && el[i-lg] >= x)
            i-=lg;
    return i;
}

int lg=1;

int main()
{

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

    scanf("%d", &n);
    for(int i=1; i<=n; i++)
    {
        scanf("%d", &a[i]);
        if(i > lg)
            lg*=2;
        poz=caut_bin(a[i], lg);
        el[poz]=a[i];
        if(poz == nrEl)
            nrEl++;
        pozitii[i]=poz;
        if(pozitii[i]>pozitii[imax])
            imax=i;
    }
    printf("%d\n", pozitii[imax]+1);

    int ant=pozitii[imax], aux=nrEl-1;
    dp[aux--]=a[imax];

    for(int i=imax; i>=0 && aux>=0; i--)
        if(pozitii[i] == ant)
        {
            dp[ant]=a[i];
            ant--;
        }

    for(int i=0; i<=pozitii[imax]; i++)
        printf("%d ", dp[i]);
    return 0;
}