Cod sursa(job #1756389)

Utilizator 2dorTudor Ciurca 2dor Data 12 septembrie 2016 19:02:49
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

int binary_search_0(const vector<int>& A, int x) {
    int lo = -1, hi = A.size(), mid;
    // A[lo] <= x < A[hi]
    while (hi - lo > 1) {
        mid = lo + (hi - lo) / 2;
        if (A[mid] <= x) {
            lo = mid;
        } else {
            hi = mid;
        }
    }
    if (lo == -1 || A[lo] != x) {
        return -1;
    } else {
        return lo + 1;
    }
}

int binary_search_1(const vector<int>& A, int x) {
    int lo = -1, hi = A.size(), mid;
    // A[lo] <= x < A[hi]
    while (hi - lo > 1) {
        mid = lo + (hi - lo) / 2;
        if (A[mid] <= x) {
            lo = mid;
        } else {
            hi = mid;
        }
    }
    return lo + 1;
}

int binary_search_2(const vector<int>& A, int x) {
    int lo = -1, hi = A.size(), mid;
    // A[lo] < x <= A[hi]
    while (hi - lo > 1) {
        mid = lo + (hi - lo) / 2;
        if (x <= A[mid]) {
            hi = mid;
        } else {
            lo = mid;
        }
    }
    return hi + 1;
}

int main() {
    ifstream fin("cautbin.in");
    int elem_cnt;
    fin >> elem_cnt;
    vector<int> A(elem_cnt);
    for (int i = 0; i < elem_cnt; ++i) {
        fin >> A[i];
    }
    ofstream fout("cautbin.out");
    int queries_cnt, operation_type, x;
    fin >> queries_cnt;
    for (int i = 0; i < queries_cnt; ++i) {
        fin >> operation_type >> x;
        switch (operation_type) {
            case 0:
                fout << binary_search_0(A, x) << '\n';
                break;
            case 1:
                fout << binary_search_1(A, x) << '\n';
                break;
            case 2:
                fout << binary_search_2(A, x) << '\n';
                break;
        }
    }
    return 0;
}