Cod sursa(job #2790852)

Utilizator Stefan_GhinescuGhinescu Stefan-George Stefan_Ghinescu Data 29 octombrie 2021 17:35:19
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include <cmath>

using namespace std;

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

const int NMAX = 100000;

int v[NMAX + 2], n;

void bs0(int x)
{
    int st = 0, dr = n - 1, mij = dr - (dr - st) / 2;
    while (st <= dr)
    {
        if (x < v[mij])
        {
            dr = mij - 1;
        }
        if (x >= v[mij])
        {
            st = mij + 1;
        }
        mij = dr - (dr - st) / 2;
    }
    if (dr < n && v[dr] == x)
        fout << dr + 1 << '\n';
    else
        fout << "-1\n";
}

void bs1(int x)
{
    int st = 0, dr = n - 1, mij = dr - (dr - st) / 2;
    while (st <= dr)
    {
        if (x < v[mij])
        {
            dr = mij - 1;
        }
        if (x >= v[mij])
        {
            st = mij + 1;
        }
        mij = dr - (dr - st) / 2;
    }
    fout << dr + 1 << '\n';
}

void bs2(int x)
{
    int st = 0, dr = n - 1, mij = dr - (dr - st) / 2;
    while (st <= dr)
    {
        if (x <= v[mij])
        {
            dr = mij - 1;
        }
        if (x > v[mij])
        {
            st = mij + 1;
        }
        mij = dr - (dr - st) / 2;
    }
    fout << st + 1 << '\n';
}

int main()
{
    int m, i, x, idk;
    fin >> n;
    for (i = 0; i < n; ++i)
        fin >> v[i];
    fin >> m;
    while (--m)
    {
        fin >> idk >> x;
        if (idk == 0)
        {
            bs0(x);
        }
        else if (idk == 1)
        {
            bs1(x);
        }
        else if (idk == 2)
        {
            bs2(x);
        }
    }
    fin >> idk >> x;
    if (idk == 0)
    {
        bs0(x);
    }
    else if (idk == 1)
    {
        bs1(x);
    }
    else if (idk == 2)
    {
        bs2(x);
    }
    return 0;
}