Cod sursa(job #2607650)

Utilizator matthriscuMatt . matthriscu Data 29 aprilie 2020 22:47:37
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <cstdio>

int n, v[100005], last[100005] {}, pred[100005] {}, i, l, pos;

int ceil(int x) {
    int st = 1, dr = n, m;
    while(st <= dr) {
        m = (st + dr) / 2;
        if(v[m] <= x)
            st = m + 1;
        else
            dr = m - 1;
    }
    return dr;
}

int main() {
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    scanf("%d", &n);
    for(i = 1; i <= n; ++i)
        scanf("%d", &v[i]);

    for(i = 1; i <= n; ++i)
        if(v[i] < v[last[1]])
            last[1] = i;
        else if(v[i] > v[last[l]]) {
            pred[i] = last[l];
            last[++l] = i;
        }
        else {
            pos = ceil(v[i]);
            last[pos] = i;
            pred[i] = last[pos-1];
        }
    printf("%d\n", l);
    for(i = last[l], l = 0; i > 0; i = pred[i])
        last[++l] = v[i];

    for(i = l; i >= 1; --i)
        printf("%d ", last[i]);

}