Cod sursa(job #2206287)

Utilizator AplayLazar Laurentiu Aplay Data 22 mai 2018 10:53:14
Problema Subsir crescator maximal Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <cstdio>
#include <iostream>

#define NMAX 100010

using namespace std;

int n, v[NMAX], sSize, s[NMAX], ans;

int bSearch(int searched, int sSize, int* s) {
    int left = 0, right = sSize - 1;
    while (left < right) {
        int middle = left + (right - left) / 2;
        if (v[searched] <= v[s[left]]) right = middle;
        else  left = middle + 1;
    }
    return left;
}

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

    cin >> n;
    for (int it = 0; it < n; ++it) {
        cin >> v[it];
    }

    ans = sSize = 1;
    s[0] = 0;
    for (int it = 1; it < n; ++it) {
        int bsIndex = bSearch(it, sSize, s);
        if (bsIndex == sSize - 1 && v[s[bsIndex]] < v[it]) {
            s[sSize++] = it;
            ++bsIndex;
        } else {
            if (0 != bsIndex && v[s[bsIndex - 1]] == v[it]) --bsIndex;
            s[bsIndex] = it;
        }

        if (ans < bsIndex + 1) ans = bsIndex + 1;
    }

    cout << ans << endl;

    return 0;
}