Cod sursa(job #3293437)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 11 aprilie 2025 17:40:02
Problema Cautare binara Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.11 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

// Cea mai mare pozitie pe care se afla un element
// cu valoarea x sau -1 daca aceasta valoare nu se
// gaseste in sir.
int tip0(const vector<int> &v, int x)
{
    int st = 0, dr = v.size()-1;

    while (st < dr) {
        int mij = (st + dr + 1) / 2;

        if (v[mij] <= x) {
            st = mij;
        }
        else { // >
            dr = mij-1;
        }
    }

    // st == dr
    if (v[st] == x) return st;
    else return -1;
}

// Cea mai mare pozitie pe care se afla un element
// cu valoarea mai mica sau egala cu x in sir.
// Se garanteaza ca cel mai mic numar al sirului este
// mai mic sau egal decat x.
int tip1(const vector<int> &v, int x)
{
    int st = 0, dr = v.size()-1;

    while (st < dr) {
        int mij = (st + dr + 1) / 2;

        if (v[mij] <= x) {
            st = mij;
        }
        else { // >
            dr = mij-1;
        }
    }

    // st == dr
    if (v[st] <= x) return st;
    else return -1;
}

// Cea mai mica pozitie pe care se afla un element
// cu valoarea mai mare sau egala cu x in sir.
// Se garanteaza ca cel mai mare numar din sir este
// mai mare sau egal decat x.
int tip2(const vector<int> &v, int x)
{
    int st = 0, dr = v.size()-1;

    while (st < dr) {
        int mij = (st + dr) / 2;

        if (v[mij] >= x) {
            dr = mij;
        }
        else { // <
            st = mij+1;
        }
    }

    // st == dr
    if (v[st] >= x) return st;
    else return -1;
}


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

    int n;
    fin >> n;

    vector<int> v(n);
    for (int i = 0; i < n; i++)
        fin >> v[i];

    int q;
    fin >> q;

    for (int i = 0; i < q; i++) {
        int tip, val;
        fin >> tip >> val;

        if (tip == 0) {
            int pos = tip0(v, val);
            fout << pos+1 << "\n";
        }
        else if (tip == 1) {
            int pos = tip1(v, val);
            fout << pos+1 << "\n";
        }
        else { // 2
            int pos = tip2(v, val);
            fout << pos+1 << "\n";
        }
    }

    return 0;
}