Cod sursa(job #2114613)

Utilizator razvan242Zoltan Razvan-Daniel razvan242 Data 25 ianuarie 2018 18:00:14
Problema Cautare binara Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>

using namespace std;

ifstream fin("cautbin.in");
ofstream fout("cautbin.out");

const int NMAX = 1e5 + 1;

int n, m;
int a[NMAX];

inline int lowerBoundSearch(int val, int op) {
    int st = 1, dr = n, mid;
    int ans = 1; // answer

    // lower bound - cea mai mare pozitie cu valoare <= decat "val"
    while (st <= dr) {
        mid = (st + dr) / 2;

        if (a[mid] <= val) {
            ans = mid;
            st = mid + 1;
        }
        else if (a[mid] > val)
            dr = mid - 1;
    }

    if (op == 0 && a[ans] != val)
        return -1;
    return ans;
}

inline int upperBoundSearch(int val) {
    int st = 1, dr = n, mid;
    int ans = 1; // answer

    // upper bound - cea mai mica pozitie cu valoare >= decat "val"
    while (st <= dr) {
        mid = (st + dr) / 2;

        if (a[mid] < val) {
            st = mid + 1;
        }
        else if (a[mid] >= val) {
            ans = mid;
            dr = mid - 1;
        }
    }

    return ans;
}

int main()
{
    fin >> n;
    for (int i = 1; i <= n; ++i)
        fin >> a[i];

    fin >> m;
    int op, val;
    while (m--) {
        fin >> op >> val;
        if (op <= 1)
            fout << lowerBoundSearch(val, op) << '\n';
        else
            fout << upperBoundSearch(val) << '\n';
    }
    return 0;
}