Cod sursa(job #1947478)

Utilizator AplayLazar Laurentiu Aplay Data 30 martie 2017 23:29:57
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <stdio.h>

#define NMAX 100010

int N, vN[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;
            ++position;
            pos[it] = buffer[right - 1];
        } else {
            if (position != 0 && vN[buffer[position - 1]] == vN[it]) --position;

            if (position != 0) {
              pos[it] = buffer[position - 1];
            } else {
                pos[it] = -1;
            }
            buffer[position] = it;
        }

        if (max < position + 1) {
            max = position + 1;
            pMax = it;
        }
    }

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

    //for (int it = 0; it < N; ++it) printf("%d ", pos[it]);
    //printf("\n");

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

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

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

    return 0;
}