// C++ program for the above approach:
#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > aux_arr;
// Function to make auxiliary array
void make_aux_array(int arr[], int n)
{
aux_arr.resize(n);
// For every element in array write
// elements and their indices in
// auxiliary array of pairs.
for (int i = 0; i < n; i++) {
aux_arr[i] = { arr[i], i };
}
// Sort auxiliary array.
sort(aux_arr.begin(), aux_arr.end());
}
// Function to perform binary search
int binarySearch(int arr[], int n, int x)
{
// For given value x perform
// Binary Search on sorted auxiliary
// array, let position be the index
// where element x is in
// auxiliary array.
int position
= lower_bound(aux_arr.begin(), aux_arr.end(),
make_pair(x, 0))
- aux_arr.begin();
if (position < n && aux_arr[position].first == x) {
// Return index of element in
// original array arr
// (aux_array[position].second).
return aux_arr[position].second;
}
else {
return -1;
}
}
// Print Function
void print(int arr[], int n, int x)
{
make_aux_array(arr, n);
int result = binarySearch(arr, n, x);
if (result == -1) {
cout << -1 << endl;
}
else {
cout << result << endl;
}
}
// Driver code
int main()
{
int arr[] = { 15, 12, 13, 19, 11, 10, 18, 17, 14, 16 };
int N = sizeof(arr) / sizeof(arr[0]);
int X = 18;
// Function call
print(arr, N, X);
return 0;
}