Cod sursa(job #1822477)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 4 decembrie 2016 22:51:14
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <cstdio>

using namespace std;

int v[100005], q[100005], p[100005];

int bs(int st, int dr, int val) {
    int last = 0, med;
    while(st <= dr) {
        med = (st + dr) / 2;
        if(q[med] < val) {
            last = med;
            st = med + 1;
        } else {
            dr = med - 1;
        }
    }
    return last + 1;
}

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

    int n, st, dr, aux;
    scanf("%d", &n);

    st = 1;
    dr = 0;

    for(int i = 1; i <= n; ++ i) {
        scanf("%d", &v[i]);
        aux = bs(st, dr, v[i]);
        if(aux == dr + 1) {
            ++ dr;
        }
        q[aux] = v[i];
        p[i] = aux;
    }

    printf("%d\n", dr);
    aux = dr;

    for(int i = n; i >= 1; -- i) {
        if(p[i] == aux) {
            q[aux] = v[i];
            -- aux;
        }
    }

    for(int i = 1; i <= dr; ++ i) {
        printf("%d ", q[i]);
    }

    return 0;
}