Cod sursa(job #2702258)

Utilizator DragosC1Dragos DragosC1 Data 3 februarie 2021 13:58:43
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <vector>
using namespace std;

vector<int> a;

int cb0(int x) {
    int st, dr, m;
    st = 0, dr = a.size() - 1;
    while (st <= dr) {
        m = (st + dr) / 2;
        if (a[m] >= x)
            dr = m - 1;
        else st = m + 1;
    }
    while (st + 1 < a.size() && a[st + 1] == x)
        st++;
    if (a[st] == x)
        return st;
    else return -1;
}

int cb1(int x) {
    int st, dr, m;
    st = 0, dr = a.size() - 1;
    while (st <= dr) {
        m = (st + dr) / 2;
        if (a[m] >= x)
            dr = m - 1;
        else st = m + 1;
    }
    while (st + 1 < a.size() && a[st + 1] == x)
        st++;
    return st;
}

int cb2(int x) {
    int st, dr, m;
    st = 0, dr = a.size() - 1;
    while (st <= dr) {
        m = (st + dr) / 2;
        if (a[m] <= x)
            st = m + 1;
        else dr = m - 1;
    }
    while (st - 1 >= 0 && a[st - 1] == x)
        st--;
    return st;
}

int main() {
    int i, n, x, m, op;

    ifstream f("cautbin.in");
    f >> n;
    for (i = 1; i <= n; i++) {
        f >> x;
        a.push_back(x);
    }
    f >> m;
    ofstream g("cautbin.out");
    for (i = 1; i <= m; i++) {
        f >> op >> x;
        if (op == 0)
            g << cb0(x) + 1 << '\n';
        else if (op == 1)
             g << cb1(x) + 1 << '\n';
        else  g << cb2(x) + 1 << '\n';
    }
    g.close();
    f.close();
    return 0;
}