Cod sursa(job #2485857)

Utilizator Mirela_MagdalenaCatrina Mirela Mirela_Magdalena Data 2 noiembrie 2019 10:12:28
Problema Subsir crescator maximal Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 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);

    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;
}