Cod sursa(job #2792248)

Utilizator NebunuWeedCiucanu Stefan NebunuWeed Data 1 noiembrie 2021 11:54:12
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.14 kb
#include <fstream>
using namespace std;

int v[100000];

int binsearch (int s, int e) {
    int l = 0, r = s - 1, a = (l + r) / 2;
    while (l <= r) {
        if (e < v[a]) {
            r = a - 1;
            a = (l + r) / 2;
            continue;
        }
        if (e > v[a]) {
            l = a + 1;
            a = (l + r) / 2;
            continue;
        }
        return a;
    }
    return -1;
}

int binsearch1 (int s, int e) {
    int l = 0, r = s - 1, a = (l + r) / 2;
    while (l <= r) {
        if (e < v[a]) {
            r = a - 1;
            a = (l + r) / 2;
            continue;
        }
        if (e > v[a]) {
            l = a + 1;
            a = (l + r) / 2;
            continue;
        }
        return a;
    }
    return -1;
}

int main () {
    ifstream in("cautbin.in");
    ofstream out("cautbin.out");
    int n, m, x;
    short nr;
    in >> n;
    for (int i = 0; i < n; ++i)
        in >> v[i];
    in >> m;
    for (int j = 0; j < m; ++j) {
        in >> nr;
        in >> x;
        int aux;
        switch (nr) {
            case 0:
                aux = binsearch(n, x);
                if (aux == -1) {
                    out << aux << '\n';
                    break;
                }
                for (int i = aux + 1; v[i] == v[aux] && i <= n; ++i)
                    aux++;
                out << aux + 1 << '\n';
            break;
            case 1:
                aux = binsearch1(n, x);
                if (v[aux] != x) {
                    out << aux << '\n';
                    break;
                }
                for (int i = aux + 1; v[i] == v[aux] && i <= n; ++i)
                    aux++;
                out << aux + 1 << '\n';
            break;
            case 2:
                aux = binsearch1(n, x);
                if (v[aux] != x) {
                    out << aux + 2 << '\n';
                    break;
                }
                for (int i = aux - 1; v[i] == v[aux] && i >= 0; --i)
                    aux--;
                out << aux + 1 << '\n';
            break;
        }
    }

    //https://infoarena.ro/problema/cautbin
//https://infoarena.ro/problema/algsort
    //
    return 0;
}