Cod sursa(job #2485864)

Utilizator Mirela_MagdalenaCatrina Mirela Mirela_Magdalena Data 2 noiembrie 2019 10:16:16
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#define NMAX 100005
#include <cstdio>
using namespace std;

int a[NMAX], v[NMAX], p[NMAX];
int n, lv, lmax, lg=1, vmax=0;

// caut binar in v unde il pun pe a[i]

int caut_bin(int x, int lg)
{
    int i;
    for(i=lv; lg!=0; lg>>=1)
        if(i - lg >= 0 && v[i-lg] >= x)
            i-=lg;
    return i;
}

void read_formV()
{
    // in p retin pozitiile din v ale tuturor elementelor din a

    scanf("%d", &n);
    for(int i=1; i<=n; ++i)
    {
        if(i > lg)
            lg *= 2;

        scanf("%d", &a[i]);
        int poz = caut_bin(a[i], lg);
        v[poz] = a[i];

        if(poz == lv)
            lv++;
        p[i] = poz;
        if(p[i] > p[vmax])
            vmax = i;
    }

}

int sol[NMAX];
void afis()
{
    freopen("scmax.out", "w", stdout);
    printf("%d\n", p[vmax]+1);

    if(p[vmax] == 0)
        printf("%d\n", a[1]);
    else{
        int val = p[vmax];
        for(int i=vmax; i>=0 && val >= 0; --i)
            if(p[i] == val)
                {sol[val] = a[i]; --val;}

        for(int i=0; i<=p[vmax]; ++i)
            printf("%d ", sol[i]);
    }

}



int main()
{
    freopen("scmax.in", "r", stdin);
    read_formV();
    afis();
    return 0;
}