Cod sursa(job #2265857)

Utilizator petru.ciocirlanPetru Ciocirlan petru.ciocirlan Data 21 octombrie 2018 20:12:30
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 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
        {
            if(V[i] < Aux[1])
            {
                Aux[1] = V[i];
                Best[i] = 1;
            }
            else
                Best[i] = BinOptim(2, 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 = 1;
    while(st < dr)
    {
        int m = dr - (dr - st) / 2;
        if(x >= Aux[m])
            st = m + 1;
        else
            dr = m - 1;
    }
    while(Aux[st++] == x);
    Aux[st] = x;
    return st;
}