Cod sursa(job #2611335)

Utilizator AlexnolifeAlexandru Ica Alexnolife Data 6 mai 2020 18:22:30
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.56 kb
#include <fstream>
#include <iostream>
#include <vector>

auto read_input(std::ifstream& f) -> std::vector<int>
{
    std::vector<int> result{};
    int count{ 0 };

    f >> count;

    result.reserve(static_cast<std::size_t>(count));

    for(int i = 0; i < count; ++i) {
        int tmp{ 0 };
        f >> tmp;
        result.push_back(tmp);
    }

    return result;
}

auto search_0(std::vector<int> const& v, int const value, int l, int r) -> int
{
    auto mid = 0U;

    while(l <= r) {
        mid = static_cast<unsigned>(l + (r - l) / 2);

        if(v[mid] <= value) {
            l = static_cast<int>(mid) + 1;
        }
        else {
            r = static_cast<int>(mid) - 1;
        }
    }

    mid = static_cast<unsigned>(l + r) / 2;

    if(v[mid] > value) {
        --mid;
    }

    return v[mid] == value ? static_cast<int>(mid) : -1;
}

auto search_1(std::vector<int> const& v, int const value, int l, int r) -> int
{
    auto mid = 0U;

    while(l <= r) {
        mid = static_cast<unsigned>(l + (r - l) / 2);

        if(v[mid] <= value) {
            l = static_cast<int>(mid) + 1;
        }
        else {
            r = static_cast<int>(mid) - 1;
        }
    }

    mid = static_cast<unsigned>(l + r) / 2;

    if(v[mid] > value) {
        --mid;
    }

    return static_cast<int>(mid);
}

auto search_2(std::vector<int> const& v, int const value, int l, int r) -> int
{
    auto mid = 0U;

    while(l <= r) {
        mid = static_cast<unsigned>(l + (r - l) / 2);

        if(v[mid] < value) {
            l = static_cast<int>(mid) + 1;
        }
        else {
            r = static_cast<int>(mid) - 1;
        }
    }

    mid = static_cast<unsigned>(l + r) / 2;

    if(v[mid] < value) {
        ++mid;
    }

    return static_cast<int>(mid);
}

auto run_queries(std::ifstream& f, std::vector<int> const& v) -> void
{
    std::ofstream g{ "cautbin.out" };
    int count{ 0 };
    auto limit = static_cast<int>(v.size()) - 1;

    f >> count;

    for(int i = 0; i < count; ++i) {
        int action{ 0 };
        int num{ 0 };

        f >> action >> num;

        switch(action) {
        case 0: {
            g << search_0(v, num, 0, limit) + 1 << std::endl;
            break;
        }
        case 1: {
            g << search_1(v, num, 0, limit) + 1 << std::endl;
            break;
        }
        case 2: {
            g << search_2(v, num, 0, limit) + 1 << std::endl;
            break;
        }
        default: {
            break;
        }
        }
    }
}

auto main() noexcept -> int
{
    std::ifstream f{ "cautbin.in" };
    run_queries(f, read_input(f));
}