Cod sursa(job #1396280)

Utilizator dinuandAndrei-Mario Dinu dinuand Data 22 martie 2015 13:15:57
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <vector>
#include <fstream>

#define TYPE_0 0
#define TYPE_1 1
#define TYPE_2 2

int binary_search0(const std::vector<int>& V, int left, int right, int x)
{
    if (left > right) return -1;
    int mid = left + (right - left) / 2;
    if (V[mid] == x && V[mid + 1] != x) return mid;
    else if (x < V[mid]) return binary_search0(V, left, mid, x);
    else return binary_search0(V, mid + 1, right, x);
}

int binary_search1(const std::vector<int>& V, int left, int right, int x)
{
    if (left > right) return -1;
    int mid = left + (right - left) / 2;
    if (V[mid] <= x && V[mid + 1] > x) return mid;
    else if (x < V[mid]) return binary_search1(V, left, mid, x);
    else return binary_search1(V, mid + 1, right, x);
}

int binary_search2(const std::vector<int>& V, int left, int right, int x)
{
    if (left > right) return -1;
    int mid = left + (right - left) / 2;
    if (V[mid] >= x && V[mid - 1] < x) return mid;
    else if (x <= V[mid]) return binary_search2(V, left, mid, x);
    else return binary_search2(V, mid + 1, right, x);
}

int main()
{
    std::ifstream in("cautbin.in");
    std::ofstream out("cautbin.out");

    int N;
    in >> N;

    std::vector<int> V(N, 0);
    for (auto i = 0u; i < V.size(); i++)
        in >> V[i];

    int op_number;
    in >> op_number;
    int op_type, x;
    for (int operation = 1; operation <= op_number; operation++) {

        in >> op_type >> x;
        switch(op_type) {
            case TYPE_0 :
                out << binary_search0(V, 0, V.size(), x) + 1 << std::endl;
                break;
            case TYPE_1 :
                out << binary_search1(V, 0, V.size(), x) + 1 << std::endl;
                break;
            case TYPE_2 :
                out << binary_search2(V, 0, V.size(), x) + 1 << std::endl;
                break;
            default :
                std::cout << "Don't give me stupid index\n";
        }

    }

    return 0;
}