Cod sursa(job #1762456)

Utilizator infomaxInfomax infomax Data 23 septembrie 2016 15:51:47
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>

using namespace std;

ifstream F ("cautbin.in");
ofstream G ("cautbin.out");

int v[100002], n, m, c, x;

int bs0(int y)
{
    int st = 1, dr = n, mij, gasit = 0;
    while (st <= dr && !gasit)
    {
        mij = (st + dr) / 2;
        if (v[mij] == y)
            gasit = 1;
        else
            {
                if (v[mij] > y)
                    dr = mij - 1;
                else
                    st = mij + 1;
            }
    }
    if (!gasit)
        return -1;
    while (v[mij] == y && mij <= n) ++ mij;
    return mij - 1;
}

int bs1(int y)
{
    int st = 1, dr = n, mij, gasit = 0;
    while (st < dr && !gasit)
    {
        mij = (st + dr) / 2;
        if (v[mij] <= y)
            st = mij + 1;
        else
            dr = mij;
    }
    mij = (st + dr) / 2;
    if (v[mij] > y) -- mij;
    return mij;
}

int bs2(int y)
{
    int st = 1, dr = n, mij, gasit = 0;
    while (st < dr && !gasit)
    {
        mij = (st + dr) / 2;
        if (v[mij] < y)
            st = mij + 1;
        else
            dr = mij;
    }
    mij = (st + dr) / 2;
    if (v[mij] < y) ++ mij;
    return mij;
}

int main()
{
    F >> n;
    for (int i = 1; i <= n; ++ i)
        F >> v[i];
    F >> m;
    for (int i = 0; i < m; ++ i)
    {
        F >> c >> x;
        if (!c) G << bs0(x) << '\n';
        else if (c == 1) G << bs1(x) << '\n';
        else if (c == 2) G << bs2(x) << '\n';
    }
    return 0;
}