Cod sursa(job #2530759)

Utilizator RobysenLazarov Robert Robysen Data 25 ianuarie 2020 11:59:01
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("cautbin.in");
ofstream g("cautbin.out");

#define nMax 100
#define max(a, b) ((a > b) ? a : b)
#define min(a, b) ((a < b) ? a : b)

int n, v[nMax];

int binary_search(int st, int dr, int val)
{
    if (st > dr) return -1;
    if (st == dr) {
        if (val == v[dr]) return dr;
        else return -1;
    }
    int m = st + (dr - st) / 2;
    if (val == v[m]) return max(binary_search(m + 1, dr, val), m);
    if (val < v[m]) return binary_search(st, m - 1, val);
    else return binary_search(m + 1, dr, val);
}

int binary_search1(int st, int dr, int val)
{
    if (st > dr) return -1;
    if (st == dr) {
        if (val >= v[dr]) return dr;
        else return -1;
    }
    int m = st + (dr - st) / 2;
    if (val >= v[m]) return max(binary_search1(m + 1, dr, val), m);
    else return binary_search1(st, m - 1, val);
}

int binary_search2(int st, int dr, int val)
{
    if (st > dr) return -1;
    if (st == dr) {
        if (val <= v[dr]) return dr;
        else return -1;
    }
    int m = st + (dr - st) / 2;
    if (val <= v[m]) return min(binary_search2(st, m - 1, val), m);
    else return binary_search2(m + 1, dr, val);
}

int main() {
    int m;
    f >> n;
    for (int i = 1; i <= n; i++)
        f >> v[i];
    f >> m;
    for (int i = 1; i <= m; i++) {
        int q, val;
        f >> q >> val;
        if (q == 0) g << binary_search(1, n, val) << '\n';
        if (q == 1) g << binary_search1(1, n, val) << '\n';
        if (q == 2) g << binary_search2(1, n, val) << '\n';
    }
}