Cod sursa(job #2079904)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 1 decembrie 2017 23:09:07
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <bits/stdc++.h>
using namespace std;

int strict_upper_bound(const vector< int >& values, size_t size, int x) {
    int left = 1, right = (int)size;
    while (left <= right) {
        int middle = (left + right) / 2;
        if (values[middle] <= x)
            left = middle + 1;
        else
            right = middle - 1;
    }

    return (values[right] == x ? right : -1);
}

int non_strict_upper_bound(const vector< int >& values, size_t size, int x) {
    int left = 1, right = (int)size;
    while (left <= right) {
        int middle = (left + right) / 2;
        if (values[middle] <= x)
            left = middle + 1;
        else
            right = middle - 1;
    }

    return right;
}

int non_strict_lower_bound(const vector< int >& values, size_t size, int x) {
    int left = 1, right = (int)size;
    while (left <= right) {
        int middle = (left + right) / 2;
        if (values[middle] < x)
            left = middle + 1;
        else
            right = middle - 1;
    }

    return left;
}

void solve() {
    size_t size;
    cin >> size;
    vector< int > values(size + 2);
    for (int i = 1; i <= (int)size; ++i)
        cin >> values[i];

    int query_count;
    cin >> query_count;
    while (query_count--) {
        int operation, x;
        cin >> operation >> x;

        switch(operation) {
            case 0:
                cout << strict_upper_bound(values, size, x);
                break;
            case 1:
                cout << non_strict_upper_bound(values, size, x);
                break;
            case 2:
                cout << non_strict_lower_bound(values, size, x);
                break;
        }

        cout << '\n';
    }
}

int main() {
    assert(freopen("cautbin.in", "r", stdin));
    assert(freopen("cautbin.out", "w", stdout));
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);

    solve();

    return 0;
}