// C++ program to search an element in sorted and rotated
// array using binary search
#include <iostream>
#include <vector>
using namespace std;
int search(vector<int>& arr, int key) {
// Initialize two pointers, lo and hi, at the start
// and end of the array
int lo = 0, hi = arr.size() - 1;
while (lo <= hi) {
int mid = lo + (hi - lo) / 2;
// If key found, return the index
if (arr[mid] == key)
return mid;
// If Left half is sorted
if (arr[mid] >key) {
// If the key lies within this sorted half,
// move the hi pointer to mid - 1
if (key >= arr[lo] && key < arr[mid])
hi = mid - 1;
// Otherwise, move the lo pointer to mid + 1
else
lo = mid + 1;
}
// If Right half is sorted
else {
// If the key lies within this sorted half,
// move the lo pointer to mid + 1
if (key > arr[mid] && key <= arr[hi])
lo = mid + 1;
// Otherwise, move the hi pointer to mid - 1
else
hi = mid - 1;
}
}
// Key not found
return -1;
}
int main() {
vector<int> arr1 = {5, 6, 7, 8, 9, 10, 1, 2, 3};
int key1 = 3;
cout << search(arr1, key1) << endl;
return 0;
}
Ly8gQysrIHByb2dyYW0gdG8gc2VhcmNoIGFuIGVsZW1lbnQgaW4gc29ydGVkIGFuZCByb3RhdGVkIAovLyBhcnJheSB1c2luZyBiaW5hcnkgc2VhcmNoCgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgc2VhcmNoKHZlY3RvcjxpbnQ+JiBhcnIsIGludCBrZXkpIHsKICAKICAgIC8vIEluaXRpYWxpemUgdHdvIHBvaW50ZXJzLCBsbyBhbmQgaGksIGF0IHRoZSBzdGFydAogICAgLy8gYW5kIGVuZCBvZiB0aGUgYXJyYXkKICAgIGludCBsbyA9IDAsIGhpID0gYXJyLnNpemUoKSAtIDE7CgogICAgd2hpbGUgKGxvIDw9IGhpKSB7CiAgICAgICAgaW50IG1pZCA9IGxvICsgKGhpIC0gbG8pIC8gMjsKCiAgICAgICAgLy8gSWYga2V5IGZvdW5kLCByZXR1cm4gdGhlIGluZGV4CiAgICAgICAgaWYgKGFyclttaWRdID09IGtleSkKICAgICAgICAgICAgcmV0dXJuIG1pZDsKCiAgICAgICAgLy8gSWYgTGVmdCBoYWxmIGlzIHNvcnRlZAogICAgICAgIGlmIChhcnJbbWlkXSA+a2V5KSB7CiAgICAgICAgICAKICAgICAgICAgICAgLy8gSWYgdGhlIGtleSBsaWVzIHdpdGhpbiB0aGlzIHNvcnRlZCBoYWxmLAogICAgICAgICAgICAvLyBtb3ZlIHRoZSBoaSBwb2ludGVyIHRvIG1pZCAtIDEKICAgICAgICAgICAgaWYgKGtleSA+PSBhcnJbbG9dICYmIGtleSA8IGFyclttaWRdKQogICAgICAgICAgICAgICAgaGkgPSBtaWQgLSAxOwogICAgICAgICAgCiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgbW92ZSB0aGUgbG8gcG9pbnRlciB0byBtaWQgKyAxCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGxvID0gbWlkICsgMTsKICAgICAgICB9CiAgICAgIAogICAgICAgIC8vIElmIFJpZ2h0IGhhbGYgaXMgc29ydGVkCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAKICAgICAgICAgICAgLy8gSWYgdGhlIGtleSBsaWVzIHdpdGhpbiB0aGlzIHNvcnRlZCBoYWxmLAogICAgICAgICAgICAvLyBtb3ZlIHRoZSBsbyBwb2ludGVyIHRvIG1pZCArIDEKICAgICAgICAgICAgaWYgKGtleSA+IGFyclttaWRdICYmIGtleSA8PSBhcnJbaGldKQogICAgICAgICAgICAgICAgbG8gPSBtaWQgKyAxOwogICAgICAgICAgCiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgbW92ZSB0aGUgaGkgcG9pbnRlciB0byBtaWQgLSAxCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGhpID0gbWlkIC0gMTsKICAgICAgICB9CiAgICB9CgkKICAJLy8gS2V5IG5vdCBmb3VuZAogICAgcmV0dXJuIC0xOyAKfQoKaW50IG1haW4oKSB7CiAgICB2ZWN0b3I8aW50PiBhcnIxID0gezUsIDYsIDcsIDgsIDksIDEwLCAxLCAyLCAzfTsKICAgIGludCBrZXkxID0gMzsKICAgIGNvdXQgPDwgc2VhcmNoKGFycjEsIGtleTEpIDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0=