Cod sursa(job #2320241)

Utilizator Teodor2305Teodor Chirosca Teodor2305 Data 14 ianuarie 2019 15:45:12
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
#include <iostream>
#include <fstream>

using namespace std;

int cautare_binara0(int v[100001], int stg, int dr, int valoare)
{
    int mijl;

    mijl = (stg + dr) / 2;

    if(stg < dr)
    {
        if(v[mijl] < valoare)
            return cautare_binara0(v, mijl + 1, dr, valoare);
        else if(v[mijl] > valoare)
            return cautare_binara0(v, stg, mijl - 1, valoare);
    }

    while(v[mijl + 1] == valoare)
        mijl++;

    if(v[mijl] == valoare)
        return mijl;

    return -1;
}

int cautare_binara1(int v[100001], int stg, int dr, int valoare)
{
    int mijl;

    mijl = (stg + dr) / 2;

    if(stg < dr)
    {
        if(v[mijl] < valoare)
            return cautare_binara1(v, mijl + 1, dr, valoare);
        else if(v[mijl] > valoare)
            return cautare_binara1(v, stg, mijl - 1, valoare);
    }

    while(v[mijl + 1] <= valoare)
        mijl++;

    return mijl;
}

int cautare_binara2(int v[100001], int stg, int dr, int valoare)
{
    int mijl;

    mijl = (stg + dr) / 2;

    if(stg < dr)
    {
        if(v[mijl] <= valoare)
            return cautare_binara2(v, mijl + 1, dr, valoare);
        else if(v[mijl] > valoare)
            return cautare_binara2(v, stg, mijl - 1, valoare);
    }

    while(v[mijl - 1] >= valoare)
        mijl--;

    return mijl;
}

int main()
{
    ifstream f("cautbin.in");
    ofstream g("cautbin.out");
    int v[100001], n, i, m, tip, x;

    f >> n;

    for(i=1; i<=n; i++)
        f >> v[i];

    f >> m;

    for(i=1; i<=m; i++)
    {
        f >> tip >> x;

        if(tip == 0)
            g << cautare_binara0(v, 1, n, x) << endl;
        else if(tip == 1)
            g << cautare_binara1(v, 1, n, x) << endl;
        else if(tip == 2)
            g << cautare_binara2(v, 1, n, x) << endl;
    }

    f.close();
    g.close();
    return 0;
}