Pagini recente » Cod sursa (job #844071) | Cod sursa (job #834524) | Cod sursa (job #2816657) | Cod sursa (job #2174441) | Cod sursa (job #3294247)
#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;
}