Cod sursa(job #2265553)

Utilizator petru.ciocirlanPetru Ciocirlan petru.ciocirlan Data 21 octombrie 2018 14:02:36
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 kb
#include <cstdio>
#include <cstdlib>

#define FILE_IN "scmax.in"
#define FILE_OUT "scmax.out"

const int MAXN = 100000 + 16;
int N, K, V[MAXN], Best[MAXN], Aux[MAXN];

int BinOptim(int, int, int);

int main()
{
    freopen(FILE_IN, "r", stdin);
    freopen(FILE_OUT, "w", stdout);

    int pos;
    scanf("%i", &N);
    for(int i = 1; i <= N; ++i)
    {
        scanf("%i", V + i);
        if(V[i] > Aux[K])
        {
            Aux[++K] = V[i];
            Best[i] = K;
            pos = i;
        }
        else
            Best[i] = BinOptim(1, K, V[i]);
    }

    printf("%i\n", K);

    Aux[K] = V[pos];
    for(int i = pos - 1, k = K - 1; i && k; --i)
        if(Best[i] == k && V[i] < V[pos])
    {
        pos = i;
        Aux[k--] = V[pos];
    }

    for(int i = 1; i <= K; ++i)
        printf("%i ", Aux[i]);

    return 0;
}

int BinOptim(int st, int dr, int x)
{
    int sol = (st == dr);
    while(st < dr)
    {
        int m = dr - (dr - st) / 2;
        if(x >= Aux[m])
            st = m + 1;
        else
        {
            sol = m;
            dr = m - 1;
        }
    }
    Aux[sol] = x;
    return sol;
}