Cod sursa(job #2035239)

Utilizator buzandanBuzan Dan Alexandru buzandan Data 9 octombrie 2017 09:26:36
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
using namespace std;

int a[100010];


int CautareBinara1(int l,int r,int val);
int CautareBinara2(int l,int r,int val);
int CautareBinara3(int l,int r,int val);

int main()
{
    int n,m,tip,val;
    ifstream fin("cautbin.in");
    ofstream fout("cautbin.out");
    fin >> n;
    for(int i = 1; i <= n; i++)
        fin >> a[i];
    fin >> m;
    for(int i = 0; i < m; i++)
    {
        fin >> tip >> val;
        if(tip == 0)
            fout << CautareBinara1(1,n,val) << '\n';
        if(tip == 1)
            fout << CautareBinara2(1,n,val) << '\n';
        if(tip == 2)
            fout << CautareBinara3(1,n,val) << '\n';

    }

}

int CautareBinara1(int l,int r,int val)
{
    int m;

    while(l <= r)
    {
        m = (l + r) / 2;

        if(a[m] <= val)
            l = m + 1;
        else
            r = m - 1;
    }
    m = (l + r) / 2;

    if(a[m] > val)
        m--;
    if(a[m] == val)
        return m;
    return -1;
}
int CautareBinara2(int l,int r,int val)
{
    int m, n = l;

    while (l < r){
        m = (l + r) / 2;
        if (a[m] <= val)
            l = m + 1;
        else
            r = m;
    }

    m = (l + r) / 2;
    if (a[m] > val)
       -- m;
    return m;
}
int CautareBinara3(int l,int r,int val)
{
    int m;

    while (l < r) {
        m = (l + r) / 2;
        if (a[m] < val)
            l = m + 1;
        else
            r = m;
    }

    m = (l + r) / 2;
    if (a[m] > val)
       -- m;
    return m;
}