Cod sursa(job #2368306)

Utilizator AplayLazar Laurentiu Aplay Data 5 martie 2019 15:22:39
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>
#include <vector>

int N, Q, type, x;
std::vector<int> n;

int exactly(int target) {
    int start = 0, end = N - 1;
    while (start < end) {
        int middle = start + (end - start) / 2 + 1;
        if (n[middle] <= target) {
            start = middle;
        } else {
            end = middle - 1;
        }
    }
    return end;
}

int upper(int target) {
    int start = 0, end = N - 1;
    while (start < end) {
        int middle = start + (end - start) / 2;
        if (n[middle] < target) {
            start = middle + 1;
        } else {
            end = middle;
        }
    }
    return start;
}

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

    scanf("%d", &N);
    for (int it = 0; it < N; ++it) {
        scanf("%d", &x);
        n.push_back(x);
    }

    scanf("%d", &Q);
    while (Q--) {
        scanf("%d%d", &type, &x);
        switch (type) {
            case 0: {
                int position = exactly(x);
                printf("%d\n", n[position] == x ? 1 + position: -1);
                break;
            }
            case 1: {
                printf("%d\n", 1 + exactly(x));
                break;
            }
            case 2: {
                printf("%d\n", 1 + upper(x));
                break;
            }
        }
    }

    return 0;
}