Cod sursa(job #2892378)

Utilizator AsakariGeicu Emil Asakari Data 21 aprilie 2022 20:40:41
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;

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

int CautareBinaraEqual_LAST(int st, int dr, int val, vector<int> &v) {
    // Cea mai mare pozitie pe care se afla un element cu valoarea x
    int mid;
    while (st <= dr) {
        mid = (st + dr) / 2;
        if (val >= v[mid])
            st = mid + 1;
        else
            dr = mid - 1;
    }
    mid = (st + dr) / 2;
    if (val < v[mid])
        mid--;
    if (val == v[mid])
        return mid;
    return -1;
}

int CautareBinaraLessOrEqual_LAST(int st, int dr, int val, vector<int> &v) {
    // Cea mai mare pozitie pe care se afla un element cu valoarea <= x
    int mid;
    while (st < dr) {
        mid = (st + dr) / 2;
        if (val >= v[mid])
            st = mid + 1;
        else
            dr = mid;
    }
    mid = (st + dr) / 2;
    if (val < v[mid])
        mid--;
    return mid;
}

int CautareBinaraGreaterOrEqual_FIRST(int st, int dr, int val, vector<int> &v) {
    int mid;
    while (st < dr) {
        mid = (st + dr) / 2;
        if (val > v[mid])
            st = mid + 1;
        else
            dr = mid;
    }
    mid = (st + dr) / 2;
    if (val > v[mid])
        mid--;
    return mid;
}

int main() {
    int nr;
    f >> nr;
    vector<int> v(nr);

    for (int i = 0; i < nr; i++)
        f >> v[i];

    int t;
    f >> t;
    while (t--) {
        int q, x;
        f >> q >> x;
        if (q == 0) {
            g << CautareBinaraEqual_LAST(0, nr - 1, x, v) + 1 << endl;
        }
        if (q == 1) {
            g << CautareBinaraLessOrEqual_LAST(0, nr - 1, x, v) + 1 << endl;
        }
        if (q == 2) {
            g << CautareBinaraGreaterOrEqual_FIRST(0, nr - 1, x, v) + 1 << endl;
        }
    }
    return 0;
}