Cod sursa(job #1996736)

Utilizator AplayLazar Laurentiu Aplay Data 2 iulie 2017 14:55:10
Problema Subsir crescator maximal Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <stdio.h>
#include <vector>

using namespace std;

int N, ans;
vector<int> numbers, bs;

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

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

    cin >> N;
    for (int it = 0; it < N; ++it) {
        int temp;
        cin >> temp;
        numbers.push_back(temp);
    }

    bs.push_back(0);
    for (int it = 1; it < N; ++it) {
        int position = binarySearch(0, bs.size() - 1, numbers[it]);
        if (bs.size() - 1 == position && numbers[bs[position]] < numbers[it]) {
            bs.push_back(it);
            ++position;
        } else {
            if (position != 0 && numbers[bs[position - 1]] == numbers[it]) --position;
            bs[position] = it;
        }

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

    cout << ans << endl;

    return 0;
}