Cod sursa(job #2561066)

Utilizator sorana5Gligor Sorana sorana5 Data 28 februarie 2020 16:10:11
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream f("cautbin.in");
ofstream g("cautbin.out");

int a[100009], n, m;

int cerinta0(int x)
{
    int st = 1, dr = n, mid;
    while (st <= dr)
    {
        mid = (st + dr) / 2;
        if (a[mid] == x && (mid == n || a[mid+1] > x))
        {
            return mid;
        }
        else if (a[mid] <= x)
            st = mid + 1;
        else
            dr = mid - 1;
    }
    return -1;
}

int cerinta1(int x)
{
    int st = 1, dr = n, mid;
    while (st <= dr)
    {
        mid = (st + dr) / 2;
        if (a[mid] <= x && (mid == n || a[mid+1] > x))
        {
            return mid;
        }
        else if (a[mid] <= x)
            st = mid + 1;
        else
            dr = mid - 1;
    }
}

int cerinta2(int x)
{
    int st = 1, dr = n, mid;
    while (st <= dr)
    {
        mid = (st + dr) / 2;
        if (a[mid] >= x && (mid == 1 || a[mid-1] < x))
        {
            return mid;
        }
        else if (a[mid] < x)
            st = mid + 1;
        else
            dr = mid - 1;
    }
}

int main()
{
    int c, x;
    f>>n;
    for (int i = 1; i <= n; ++i)
        f>>a[i];
    f>>m;
    for (int i = 1; i <= m; ++i)
    {
        f>>c>>x;
        if (c == 0)
            g<<cerinta0(x)<<'\n';
        else if (c == 1)
            g<<cerinta1(x)<<'\n';
        else if (c == 2)
            g<<cerinta2(x)<<'\n';
    }
    f.close();
    g.close();
    return 0;
}