Cod sursa(job #2467206)

Utilizator gicugAndrei gicug Data 3 octombrie 2019 20:22:54
Problema Cautare binara Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include <vector>

size_t b1(const std::vector<unsigned>& v, unsigned lookup, size_t startIndex, size_t len) {
    // primul element mai mare
    while (len) {
        size_t m = startIndex + len / 2;
        if (v[m] > lookup) {
            len = len / 2;
        } else {
            startIndex += len / 2 + 1;
            len = len - len / 2 - 1;
        }
    }
    return startIndex;
}

int b2(const std::vector<unsigned>& v, unsigned lookup, size_t startIndex, size_t len) {
    // primul element mai mare sau egal
    while (len) {
        size_t m = startIndex + len / 2;
        if (v[m] >= lookup) {
            len = len / 2;
        } else {
            startIndex += len / 2 + 1;
            len = len - len / 2 - 1;
        }
    }
    return startIndex;
}

int bb1(const std::vector<unsigned>& v, unsigned lookup, size_t startIndex, size_t len) {
    size_t firstHi = b1(v, lookup, startIndex, len);
    return firstHi - 1;
}

int b0(const std::vector<unsigned>& v, unsigned lookup, size_t startIndex, size_t len) {
    int result = bb1(v, lookup, startIndex, len);
    return v[result] == lookup ? result: -2;
};


using QueryFunc = int(const std::vector<unsigned>&, unsigned, size_t, size_t);


// 1 3 3 3 5 6 7
//
//

int main() {
    std::ifstream fin("cautbin.in");
    std::ofstream fout("cautbin.out");
    size_t n;
    fin >> n;
    std::vector<unsigned> v;
    v.reserve(n);


    for (size_t i = 0; i < n; ++i) {
        unsigned el;
        fin >> el;
        v.push_back(el);
    }

    QueryFunc* const queries[] = {b0, bb1, b2};

    size_t m, query;
    unsigned lookup;
    fin >> m;
    for (size_t i = 0; i < m; ++i) {
        fin >> query >> lookup;
        int res = queries[query](v, lookup, 0, v.size());
        fout << res + 1 << std::endl;
    }
    return 0;
}