Cod sursa(job #2662917)

Utilizator CalinusCalin Navadaru Calinus Data 24 octombrie 2020 20:29:45
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>

using namespace std;

ifstream fin("cautbin.in");
ofstream fout("cautbin.out");

int n, m;
int sir[100000];
int cerinta[100000], x[100000];

int caut_bin_0(int lm, int y)
{
    int i;
    for(i = 0; lm > 0; (lm>>=1))
        if(i + lm < n && sir[i+lm] == y)
            i = i + lm;
    return (sir[i] == y)? i+1:-1;
}

int caut_bin_1(int lm, int y)
{
    int i;
    for(i = 0; lm > 0; (lm>>=1))
        if(i + lm < n && sir[i+lm] <= y)
            i = i + lm;
    return (sir[i] == y)? i+1:-1;
}

int caut_bin_2(int lm, int y)
{
    int i;
    for(i = 0; lm > 0; (lm>>=1))
        if(i + lm < n && sir[i + lm] < y)
            i = i + lm;
    i++;
    return (sir[i] == y)? i+1:-1;
}

void initializare_lm(int &lm)
{
    int copie_nr = n;
    while(copie_nr > lm)
        lm<<=1;
}

void citire()
{
    fin >> n;
    for(int i = 0; i < n; i++)
        fin >> sir[i];

    fin >> m;
    for(int i = 0; i < m; i++)
        fin >> cerinta[i] >> x[i];
}

void rezolvare(int lm)
{
    for(int i = 0; i < m; i++)
        switch(cerinta[i])
        {
            case 0:
                fout << caut_bin_0(lm, x[i]) << '\n';
                break;
            case 1:
                fout << caut_bin_1(lm, x[i]) << '\n';
                break;
            case 2:
                fout << caut_bin_2(lm, x[i]) << '\n';
                break;
        }
}

int main()
{
    citire();
    int lm = 1;
    initializare_lm(lm);
    rezolvare(lm);
    return 0;
}