import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
// assuming ascending order a[0] <= a[1]
public static int find_first_index (int [] arr)
{
for(int i = 0; i < arr.length; i++)
{
if(arr[i] > arr[(i+1) % arr.length])
{
return (i+1) % arr.length;
}
}
return 0;
}
public static int startSearch(int a[], int x)
{
int f = find_first_index(a);
return search(a, f, 0, (a.length-1), x);
}
public static int search(int a[], int f, int left, int right, int x)
{
int s = a.length;
int mid = (left + right) / 2;
if (x == a[(mid+f)%s]) { // Found element
return mid;
}
if (right < left) {
return -1;
}
/* While there may be an inflection point due to the rotation, either the left or
* right half must be normally ordered. We can look at the normally ordered half
* to make a determination as to which half we should search.
*/
if (a[(left+f)%s] < a[(mid+f)%s]) { // Left is normally ordered.
if (x >= a[(left+f)%s] && x < a[(mid+f)%s]) {
return search(a, f, left, mid - 1, x);
} else {
return search(a, f, mid + 1, right, x);
}
} else if (a[(mid+f)%s] < a[(left+f)%s]) { // Right is normally ordered.
if (x > a[(mid+f)%s] && x <= a[(right+f)%s]) {
return search(a, f, mid + 1, right, x);
} else {
return search(a, f, left, mid - 1, x);
}
} else if (a[(left+f)%s] == a[(mid+f)%s]) { // Left is either all repeats OR loops around (with the right half being all dups)
if (a[(mid+f)%s] != a[(right+f)%s]) { // If right half is different, search there
return search(a, f, mid + 1, right, x);
} else { // Else, we have to search both halves
int result = search(a, f, left, mid - 1, x);
if (result == -1) {
return search(a, f, mid + 1, right, x);
} else {
return result;
}
}
}
return -1;
}
{
// your code goes here
}
}
aW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgpjbGFzcyBJZGVvbmUKewoJLy8gYXNzdW1pbmcgYXNjZW5kaW5nIG9yZGVyIGFbMF0gPD0gYVsxXQogICAgcHVibGljIHN0YXRpYyBpbnQgZmluZF9maXJzdF9pbmRleCAoaW50IFtdIGFycikKICAgIHsKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYoYXJyW2ldID4gYXJyWyhpKzEpICUgYXJyLmxlbmd0aF0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiAoaSsxKSAlIGFyci5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAwOwogICAgfQoJCglwdWJsaWMgc3RhdGljIGludCBzdGFydFNlYXJjaChpbnQgYVtdLCBpbnQgeCkKCXsKCQlpbnQgZiA9IGZpbmRfZmlyc3RfaW5kZXgoYSk7CgkJCgkJcmV0dXJuIHNlYXJjaChhLCBmLCAwLCAoYS5sZW5ndGgtMSksIHgpOwoJfQoJCglwdWJsaWMgc3RhdGljIGludCBzZWFyY2goaW50IGFbXSwgaW50IGYsIGludCBsZWZ0LCBpbnQgcmlnaHQsIGludCB4KQoJewoJCWludCBzID0gYS5sZW5ndGg7CgkgICAgaW50IG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKCSAgICBpZiAoeCA9PSBhWyhtaWQrZiklc10pIHsgLy8gRm91bmQgZWxlbWVudAoJICAgICAgICByZXR1cm4gbWlkOwoJICAgIH0KCSAgICBpZiAocmlnaHQgPCBsZWZ0KSB7CgkgICAgICAgIHJldHVybiAtMTsKCSAgICB9CgkKCSAgICAvKiBXaGlsZSB0aGVyZSBtYXkgYmUgYW4gaW5mbGVjdGlvbiBwb2ludCBkdWUgdG8gdGhlIHJvdGF0aW9uLCBlaXRoZXIgdGhlIGxlZnQgb3IgCgkgICAgICogcmlnaHQgaGFsZiBtdXN0IGJlIG5vcm1hbGx5IG9yZGVyZWQuICBXZSBjYW4gbG9vayBhdCB0aGUgbm9ybWFsbHkgb3JkZXJlZCBoYWxmCgkgICAgICogdG8gbWFrZSBhIGRldGVybWluYXRpb24gYXMgdG8gd2hpY2ggaGFsZiB3ZSBzaG91bGQgc2VhcmNoLiAKCSAgICAgKi8KCSAgICAgCgkgICAgaWYgKGFbKGxlZnQrZiklc10gPCBhWyhtaWQrZiklc10pIHsgLy8gTGVmdCBpcyBub3JtYWxseSBvcmRlcmVkLgoJICAgICAgICBpZiAoeCA+PSBhWyhsZWZ0K2YpJXNdICYmIHggPCBhWyhtaWQrZiklc10pIHsgCgkgICAgICAgICAgICByZXR1cm4gc2VhcmNoKGEsIGYsIGxlZnQsIG1pZCAtIDEsIHgpOwoJICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgcmV0dXJuIHNlYXJjaChhLCBmLCBtaWQgKyAxLCByaWdodCwgeCk7CgkgICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKGFbKG1pZCtmKSVzXSA8IGFbKGxlZnQrZiklc10pIHsgLy8gUmlnaHQgaXMgbm9ybWFsbHkgb3JkZXJlZC4KCSAgICAgICAgaWYgKHggPiBhWyhtaWQrZiklc10gJiYgeCA8PSBhWyhyaWdodCtmKSVzXSkgewoJICAgICAgICAgICAgcmV0dXJuIHNlYXJjaChhLCBmLCBtaWQgKyAxLCByaWdodCwgeCk7CgkgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICByZXR1cm4gc2VhcmNoKGEsIGYsIGxlZnQsIG1pZCAtIDEsIHgpOwoJICAgICAgICB9ICAgICAgICAgICAgICAgCgkgICAgfSBlbHNlIGlmIChhWyhsZWZ0K2YpJXNdID09IGFbKG1pZCtmKSVzXSkgeyAvLyBMZWZ0IGlzIGVpdGhlciBhbGwgcmVwZWF0cyBPUiBsb29wcyBhcm91bmQgKHdpdGggdGhlIHJpZ2h0IGhhbGYgYmVpbmcgYWxsIGR1cHMpCgkgICAgICAgIGlmIChhWyhtaWQrZiklc10gIT0gYVsocmlnaHQrZiklc10pIHsgLy8gSWYgcmlnaHQgaGFsZiBpcyBkaWZmZXJlbnQsIHNlYXJjaCB0aGVyZQoJICAgICAgICAgICAgcmV0dXJuIHNlYXJjaChhLCBmLCBtaWQgKyAxLCByaWdodCwgeCk7CgkgICAgICAgIH0gZWxzZSB7IC8vIEVsc2UsIHdlIGhhdmUgdG8gc2VhcmNoIGJvdGggaGFsdmVzCgkgICAgICAgICAgICBpbnQgcmVzdWx0ID0gc2VhcmNoKGEsIGYsIGxlZnQsIG1pZCAtIDEsIHgpOyAKCSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKCSAgICAgICAgICAgICAgICByZXR1cm4gc2VhcmNoKGEsIGYsIG1pZCArIDEsIHJpZ2h0LCB4KTsgCgkgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CgkgICAgICAgICAgICB9CgkgICAgICAgIH0KCSAgICB9CgkgICAgcmV0dXJuIC0xOwoJfQoJCgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCX0KfQ==