Cod sursa(job #1761889)

Utilizator CaterpillerLeaf Caterpiller Caterpiller Data 23 septembrie 2016 01:18:30
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <iostream>

template<class Iterator, class Numerical>
Iterator findUpperBound(Iterator first, Iterator last, const Numerical& x)
{
    if (*first > x) return last;
    while (last - first > 1) {
        Iterator middle = first + (last - first) / 2;
        if (*middle <= x) {
            first = middle;
        }
        else {
            last = middle;
        }
    }
    return first;
}

template<class Iterator, class Numerical>
Iterator findLowerBound(Iterator first, Iterator last, const Numerical& x)
{
    if (*first >= x) return first;
    while (last - first > 1) {
        Iterator middle = first + (last - first) / 2;
        if (*middle < x) {
            first = middle;
        }
        else {
            last = middle;
        }
    }
    return last;
}

template<class Iterator, class Numerical>
Iterator doBinarySearch(Iterator first, Iterator last, const Numerical& x)
{
    Iterator it = findUpperBound(first, last, x);
    if (*it == x) return it;
    else return last;
}

int main()
{
    std::ifstream input("cautbin.in");
    std::ofstream output("cautbin.out");
    int n, m;
    int *v;

    input >> n;
    v = new int[n];
    for (int i = 0; i < n; ++i) {
        input >> v[i];
    }

    input >> m;
    for (int i = 0; i < m; ++i) {
        int type, x;
        int* p;
        input >> type >> x;
        switch (type) {
        case 0:
            p = doBinarySearch(v, v + n, x);
            break;
        case 1:
            p = findUpperBound(v, v + n, x);
            break;
        case 2:
            p= findLowerBound(v, v + n, x);
            break;
        }
        if (p == 0) output << "-1\n";
        else output << p - v + 1 << '\n';
    }

    return 0;
}