Cod sursa(job #2892382)

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

ifstream f("cautbin.in");
ofstream g("cautbin.out");
vector<int> v;
int CautareBinaraEqual_LAST(int st, int dr, int val) {
    // 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 -2;
}

int CautareBinaraLessOrEqual_LAST(int st, int dr, int val) {
    // 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) {
    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;
    v.resize(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) + 1 << "\n";
        }
        if (q == 1) {
            g << CautareBinaraLessOrEqual_LAST(0, nr - 1, x) + 1 << "\n";
        }
        if (q == 2) {
            g << CautareBinaraGreaterOrEqual_FIRST(0, nr - 1, x) + 1 << "\n";
        }
    }
    return 0;
}