Cod sursa(job #2199456)

Utilizator LivcristiTerebes Liviu Livcristi Data 27 aprilie 2018 19:56:28
Problema Cautare binara Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <fstream>
#define NUM 100005
int v[NUM];
int n, m, cod, x;
int st, dr, mij;
using namespace std;
int binar0()
{
    st = 0;
    dr = n - 1;
    mij = st + (dr - st) / 2;
    while(st <= dr && v[mij] != x)
    {
        mij = st + (dr - st) / 2;
        if(v[mij] < x)
            st = mij + 1;
        else
            dr = mij - 1;
    }
    if(v[mij] != x)
        return -1;
    while(v[mij + 1] == x && mij < n)
        mij++;
    return mij + 1;
}
int binar1()
{
    st = 0;
    dr = n - 1;
    mij = st + (dr - st) / 2;
    while(st <= dr && v[mij] != x)
    {
        mij = st + (dr - st) / 2;
        if(v[mij] < x)
            st = mij + 1;
        else
            dr = mij - 1;
    }
    while(v[mij + 1] <= x && mij < n)
            mij++;
    return mij + 1;
}
int binar2()
{
    st = 0;
    dr = n - 1;
    mij = st + (dr - st) / 2;
    while(st <= dr && v[mij] != x)
    {
        mij = st + (dr - st) / 2;
        if(v[mij] < x)
            st = mij + 1;
        else
            dr = mij - 1;
    }
    while(v[mij - 1] >= x && mij > 0)
            mij--;
    return mij + 1;
}
int main()
{
    ifstream f("cautbin.in");
    ofstream g("cautbin.out");
    f >> n;
    for(int i = 0; i < n; ++i)
        f >> v[i];
    f >> m;
    for(int i = 0; i < m; ++i)
    {
        f >> cod >> x;
        switch(cod)
        {
        case 0:
            g << binar0();
            break;
        case 1:
            g << binar1();
            break;
        case 2:
            g << binar2();
            break;
        }
        g << "\n";
    }
    f.close();
    g.close();
}