Cod sursa(job #1947430)

Utilizator AplayLazar Laurentiu Aplay Data 30 martie 2017 22:50:55
Problema Subsir crescator maximal Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>

#define NMAX 100010

int N, vN[NMAX], length[NMAX], pos[NMAX], buffer[NMAX], left, right, max = -1, pMax, ans[NMAX], pAns;

int binarySearch(int left, int right, int target) {
    while (left != right) {
        int middle = (left + right) / 2;
        if (vN[buffer[middle]] <= target) {
            left = middle + 1;
        } else {
            right = middle;
        }
    }

    return left;
}

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

    scanf("%d", &N);
    for (int it = 0; it < N; ++it) {
        scanf("%d", &vN[it]);
    }

    left = right = 0;
    vN[N] = vN[0] + 1;
    pos[N] = -1;
    buffer[0] = N;
    for (int it = 0; it < N; ++it) {
        int position = binarySearch(left, right, vN[it]);

        if (right == position && vN[buffer[position]] < vN[it]) {
            buffer[++right] = it;
            pos[it] = buffer[right - 1];
            length[it] = right - left + 1;
        } else {
            pos[it] = pos[buffer[position]];
            buffer[position] = it;
            length[it] = position - left + 1;
        }

        if (max < length[it]) {
            max = length[it];
            pMax = it;
        }
    }

    printf("%d\n", max);

    pAns = max;
    while(pMax != -1) {
        ans[--pAns] = vN[pMax];
        pMax = pos[pMax];
    }

    for (int it = 0; it < max; ++it) {
        printf("%d ", ans[it]);
    }

    fclose(stdin);
    //fclose(stdout);

    return 0;
}