Cod sursa(job #2542039)

Utilizator KPP17Popescu Paul KPP17 Data 9 februarie 2020 13:20:16
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.89 kb
/**

Dupa rezolvarea problemei am facut o harta a cautarii binare
(se muta i cand [mijloc] (operator) x == true)

                       (i )                                                                     ( j)
       valoare gasita: (x-) (x-) (x-) ... (x-) (x-) (x) (x) ... (x) (x) (x+) (x+) ... (x+) (x+) (x+)
operator de comparare:                         (< ) (<)            (<=) (<=)
      indice returnat:                         ( j) (i)             (j) (i )

**/


using namespace std;



#define fisier "cautbin"

#ifdef fisier
    #include <fstream>
    ifstream in(fisier ".in");
    ofstream out(fisier ".out");
#else
    #include <iostream>
    #define in cin
    #define out cout
#endif



int n, v[100000];



inline bool mai_mic(bool sau_egal, int a, int b) {

    return sau_egal?
        (a <= b):
        (a < b);

}



int cb(int val, bool sau_egal, bool rt_i) {

    int i = 0, j = n - 1, mij;

    while (i <= j) {

        mij = (i + j) / 2;

        if (mai_mic(sau_egal, v[mij], val)) {

            i = mij + 1;

        } else {

            j = mij - 1;

        }

    }

    if (rt_i)
        return i;

    return j;

}



int main() {

    int m, val, tip, rez;



    in >> n;

    for (rez = 0; rez < n; rez++) {

        in >> v[rez];

    }



    in >> m;

    while (m--) {

        in >> tip >> val;

        switch (tip) {

            case 0:

                rez = cb(val, true, false);

                if (rez == -1 || v[rez] != val) {

                    rez = -2;

                }

                break;


            case 1:

                rez = cb(val, true, false);

                break;


            case 2:

                rez = cb(val, false, true);

                break;

        }

        out << rez + 1 << '\n';

    }

}





//