Cod sursa(job #1823549)

Utilizator Dupree7FMI Ciobanu Andrei Dupree7 Data 6 decembrie 2016 16:35:07
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>

using namespace std;

ifstream f("cautbin.in");
ofstream g("cautbin.out");

unsigned int n, v[100001];

int CautBin0(int x)
{
    int lo = 0, hi = n - 1, mid;

    while(lo <= hi)
    {
        mid = lo + (hi - lo) / 2;
        if(x > mid)
            lo = mid + 1;
        else if(x < mid)
            hi = mid - 1;
        else
        {
            while(v[mid] == v[mid + 1])
                    mid++;

            return mid + 1;
        }
    }

    return -1;
}

int CautBin1(int x)
{
    int lo = 0, hi = n - 1, mid;

    while(lo <= hi)
    {
        mid = lo + (hi - lo) / 2;
        if(x > mid)
            lo = mid + 1;
        else if(x < mid)
            hi = mid - 1;
        else
        {
            while(v[mid] == v[mid + 1])
                    mid++;

            return mid + 1;
        }
    }

    return CautBin1(x - 1);
}

int CautBin2(int x)
{
    int lo = 0, hi = n - 1, mid;

    while(lo <= hi)
    {
        mid = lo + (hi - lo) / 2;
        if(x > mid)
            lo = mid + 1;
        else if(x < mid)
            hi = mid - 1;
        else
        {
            while(v[mid] == v[mid + 1])
                    mid--;

            return mid - 1;
        }
    }

    return CautBin2(x + 1);
}

int main()
{
    unsigned int i, m, a, b;

    f >> n;
    for(i = 0; i < n; i++)
        f >> v[i];
    f >> m;

    for(i = 0; i < m; i++)
    {
        f >> a >> b;

        if(a == 0)
            g << CautBin0(b) << "\n";
        else if(a == 1)
            g << CautBin1(b) << "\n";
        else
            g << CautBin2(b) << "\n";
    }

    return 0;
}