Cod sursa(job #797816)

Utilizator psycho21rAbabab psycho21r Data 14 octombrie 2012 22:21:21
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <fstream>
#include <vector>

using namespace std;
vector<int> elements;

int zero(int query)
{
    int left, middle, right;

    left = -1;
    right = elements.size();

    while(right - left > 1)
    {
        middle = left + (right - left)/2;
        if(query < elements[middle])
            right = middle;
        else
            left = middle;
    }

    if(elements[left] == query)
        return left + 1;

    return -1;
}

int one(int query)
{
    int left, middle, right;

    left = -1;
    right = elements.size();

    while(right - left > 1)
    {
        middle = left + (right - left)/2;
        if(query < elements[middle])
            right = middle;
        else
            left = middle;
    }

    if(query <= elements[left])
        return left + 1;

    return -1;
}

int two(int query)
{
    int left, middle, right;

    left = -1;
    right = elements.size();

    while(right - left > 1)
    {
        middle = left + (right - left)/2;
        if(query <= elements[middle])
            right = middle;
        else
            left = middle;
    }

    if(query >= elements[right])
        return right + 1;

    return -1;
}

int main()
{
    ifstream in("cautbin.in");
    int N, M;
    in >> N;
    elements.resize(N);
    for(int i = 0; i < N; ++i)
        in >> elements[i];

    in >> M;

    ofstream out("cautbin.out");
    for(int i = 0, type, query; i < M; ++i)
    {
        in >> type >> query;
        switch(type)
        {
            case 0:
                out << zero(query) << " ";
                break;
            case 1:
                out << one(query) << " ";
                break;
            case 2:
                out << two(query) << " ";
                break;
        }
    }
    in.close();
    out.close();

    return 0;
}