Cod sursa(job #3294247)

Utilizator andrei_botorogeanuBotorogeanu Andrei andrei_botorogeanu Data 20 aprilie 2025 12:59:55
Problema Cautare binara Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.07 kb
#include <iostream>
#include <fstream>
#define FIN "cautbin.in"
#define FOUT "cautbin.out"

using namespace std;

//lo = 0
//hi = 8
//value = 7
//middle = 5
//middle+1,hi
//vec: 1 2 3 4 5 6 7 8 9
//cea mai mare pozitie pe care se afla un element cu valoarea x sau -1 daca aceasta valoare nu se gaseste in sir
int binary_search0( int *arr, int lo, int hi, int key ) {

       if( lo > hi ) {

            return -1;
       }

       int middle = ( lo + hi ) >> 1;

       if(arr[middle] == key) {


               if(middle < hi) {

                         if(arr[middle+1] == key) {
                            return binary_search0(arr, middle+1, hi, key);
                         } else {
                           return middle;
                         }

               } else return middle;



       } else if(arr[middle] < key) {

              return binary_search0(arr, middle+1, hi, key);
       } else {
              return binary_search0(arr, lo, middle-1, key);
       }

}

// 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 binary_search1( int *arr, int lo, int hi, int key ) {

       if( lo > hi ) {

            return -1;
       }
       int middle = ( lo + hi) / 2;

       if(arr[middle] <= key) {

              if( middle < hi ) {

                     if(arr[ middle + 1 ] > key) return middle;

                     else return binary_search1(arr, middle + 1, hi, key);

              } else {

                     return middle;
              }

       } else {

           return binary_search1(arr, lo, middle - 1, key);
       }

}

// cea mai mica pozitie pe care se afla un element cu valoarea mai mare sau egala cu x in sir.
int binary_search2( int *arr, int lo, int hi, int key ) {

  if( lo > hi ) {

      return -1;
  }

  int middle = ( lo + hi) / 2;

  if(arr[ middle ] >= key) {

          if(lo < middle) {

                    if(arr[middle-1]<key) {
                      return middle;
                    }else {
                      return binary_search2(arr, lo, middle-1, key);
                    }

          } else {

            return middle;
          }

  } else {

       return binary_search2(arr, middle+1, hi, key);
  }

}

int main(int argc, char const *argv[]) {


  ifstream fin(FIN);

  ofstream fout(FOUT);

  //                        arr, lo, hi   X
  typedef int (*fnPointer)(int*,int, int, int);

  int length;

  fin>>length;

  int array[ length ];


  for(int i = 0; i < length; ++i) fin>>array[i];

  //                    0 x             1 x             2 x
  fnPointer fn[ 3 ] = { binary_search0, binary_search1, binary_search2 };

  int numOps;

  fin>>numOps;

  while( numOps-- ) {

     int op, value;

     fin>>op>>value;

     int index = fn[ op ] (array, 0, length - 1, value);
     //daca op = 0
     //fn[0] = binary_search0
     //daca op = 1
     //fn[1] = binary_search1
     //fn[2] = binary_search2

     if( index == -1 ) {

          fout<<index<<"\n";

     } else {

          fout<<index+1<<"\n";
     }
  }

  return 0;
}