Cod sursa(job #1947383)

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

#define NMAX 100010

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

int binarySearch(int left, int right, int target) {
    while (left != right) {
        int middle = (left + right) / 2;
        if (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;
    buffer[0] = vN[0] + 1;
    for (int it = 0; it < N; ++it) {
        int position = binarySearch(left, right, vN[it]);

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

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

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

    fclose(stdin);
    fclose(stdout);

    return 0;
}