/**
INPUT FORMAT:
Line1 : array elements, seprated by space.
Line 2: number, which is to be searched
**/
import java.util.Scanner;
class Main{
public static void main
(String args
[]){ Scanner sc
= new Scanner
(System.
in); // System.out.println("Enter array elements separted by space");
String [] strArr
= sc.
nextLine().
split(" "); // System.out.println("Enter Number to find: ");
int n = sc.nextInt();
int[] arr = new int[strArr.length];
for(int i=0;i<arr.length;i++){ // this is not O(n) . Just for taking input & creating array :-)
arr
[i
]= Integer.
parseInt(strArr
[i
]); }
if (binSearchinRotatedArray(arr,n) )
else
System.
out.
println("NOT FOUND"); }
static boolean binSearchinRotatedArray(int arr[], int n){ // Actual program
int start=0;
int end = arr.length-1;
int k=0;
while(start<=end){ // find the merging point of rotated element O(log n )
k=(start+end)/2;
if(arr[k]>arr[0]){ // first half already sorted
start=k+1;
}
else
end = k-1;
}
k=start;
start=0;
end = arr.length-1;
return binSearch(arr, n, start, k-1) || binSearch(arr, n, k, end); // O(log n) + O ( log n)
}
static boolean binSearch(int arr[], int number, int start, int end) { // binarySerach with given indices
int mid;
while(start<=end){ // do binary search O(log n)
mid = (start+end)/2;
if(arr[mid]> number)
end=mid-1;
else if(arr[mid]<number)
start=mid+1;
else // element in found.
return true;
}
return false;
}
}
LyoqCklOUFVUIEZPUk1BVDoKCUxpbmUxIDogYXJyYXkgZWxlbWVudHMsIHNlcHJhdGVkIGJ5IHNwYWNlLgoJTGluZSAyOiBudW1iZXIsIHdoaWNoIGlzIHRvIGJlIHNlYXJjaGVkCgkKKiovCgppbXBvcnQgamF2YS51dGlsLlNjYW5uZXI7CgpjbGFzcyBNYWluewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSl7CgkJU2Nhbm5lciBzYyA9IG5ldyBTY2FubmVyKFN5c3RlbS5pbik7CgkvLwlTeXN0ZW0ub3V0LnByaW50bG4oIkVudGVyIGFycmF5IGVsZW1lbnRzIHNlcGFydGVkIGJ5IHNwYWNlIik7CgkJU3RyaW5nIFtdIHN0ckFyciA9IHNjLm5leHRMaW5lKCkuc3BsaXQoIiAiKTsKCS8vCVN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXIgTnVtYmVyIHRvIGZpbmQ6ICIpOwoJCWludCBuID0gc2MubmV4dEludCgpOwoJCWludFtdIGFyciA9IG5ldyBpbnRbc3RyQXJyLmxlbmd0aF07CgkJZm9yKGludCBpPTA7aTxhcnIubGVuZ3RoO2krKyl7CQkvLyB0aGlzIGlzIG5vdCBPKG4pIC4gIEp1c3QgZm9yIHRha2luZyBpbnB1dCAmIGNyZWF0aW5nIGFycmF5IDotKQoJCQlhcnJbaV09IEludGVnZXIucGFyc2VJbnQoc3RyQXJyW2ldKTsKCQl9CgkJCgkJaWYgKGJpblNlYXJjaGluUm90YXRlZEFycmF5KGFycixuKSApCgkJCVN5c3RlbS5vdXQucHJpbnRsbigiRk9VTkQiKTsKCQllbHNlCgkJCVN5c3RlbS5vdXQucHJpbnRsbigiTk9UIEZPVU5EIik7Cgl9CgpzdGF0aWMgYm9vbGVhbiBiaW5TZWFyY2hpblJvdGF0ZWRBcnJheShpbnQgYXJyW10sIGludCBuKXsJCS8vIEFjdHVhbCBwcm9ncmFtCgkJaW50IHN0YXJ0PTA7CgkJaW50IGVuZCA9IGFyci5sZW5ndGgtMTsKCQlpbnQgaz0wOwoJCQoJCXdoaWxlKHN0YXJ0PD1lbmQpeyAvLyBmaW5kIHRoZSBtZXJnaW5nIHBvaW50IG9mIHJvdGF0ZWQgZWxlbWVudCAgTyhsb2cgbiApCgoJCQlrPShzdGFydCtlbmQpLzI7CgkJCWlmKGFycltrXT5hcnJbMF0pewkvLyBmaXJzdCBoYWxmIGFscmVhZHkgc29ydGVkCgkJCQlzdGFydD1rKzE7CgkJCX0KCQkJZWxzZQoJCQkJZW5kID0gay0xOwkKCQl9CgoJCWs9c3RhcnQ7CgkJc3RhcnQ9MDsKCQllbmQgPSBhcnIubGVuZ3RoLTE7CgkJU3lzdGVtLm91dC5wcmludGxuKCJrOiAiK2spOwoJCXJldHVybiBiaW5TZWFyY2goYXJyLCBuLCBzdGFydCwgay0xKSB8fCBiaW5TZWFyY2goYXJyLCBuLCBrLCBlbmQpOyAgICAvLyBPKGxvZyBuKSArIE8gKCBsb2cgbikKCX0KCQoJc3RhdGljIGJvb2xlYW4gYmluU2VhcmNoKGludCBhcnJbXSwgaW50IG51bWJlciwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CQkvLyBiaW5hcnlTZXJhY2ggd2l0aCBnaXZlbiBpbmRpY2VzIAoJCWludCBtaWQ7CgkJCgkJd2hpbGUoc3RhcnQ8PWVuZCl7ICAgLy8gZG8gYmluYXJ5IHNlYXJjaCAgTyhsb2cgbikKCQkJbWlkID0gKHN0YXJ0K2VuZCkvMjsKCQkJCgkJCWlmKGFyclttaWRdPiBudW1iZXIpCgkJCQllbmQ9bWlkLTE7CgkJCWVsc2UgaWYoYXJyW21pZF08bnVtYmVyKQoJCQkJc3RhcnQ9bWlkKzE7CgkJCWVsc2UJCS8vIGVsZW1lbnQgaW4gZm91bmQuCgkJCQlyZXR1cm4gdHJ1ZTsKCQl9CgoJCXJldHVybiBmYWxzZTsKCX0KCgoKfQ==