pranay_teja
11/9/2018 - 10:17 AM

SearchInRotatedSortedArray-BinarySearch

#include<bits.stdc++.h>
using namespace std;

int findPivot(vector<int> A){
    if(A.size()==0){
        return -1;
    }
    int start=0,end=A.size()-1;
    if(A[start]<=A[end]){
        return -1; // already sorted
    }
    while(start<end){
        if(start==end-1){
            if(A[end]<A[start]){
                return start; // nase case when 2 elements left
            }else{
                return -1;
            }
        }
        int mid=start+(end-start)/2;
        if(mid<A.size()-1 && A[mid+1]<A[mid]){
            return mid; // pivot found
        }
        if(A[start]<=A[mid]){ // left part is sorted
            start=mid;
        }else{
            end=mid;
        }
    }
}
int bin(vector<int> A, int B,int l, int r){
    int start=l,end=r;
    while(start<=end){
        int mid=start+(end-start)/2;
        if(A[mid]==B){
            return mid;
        }else if(A[mid]<B){
            start=mid+1;
        }else{
            end=mid-1;
        }
    }
    return -1;
}
int searchInRotatedArray(const vector<int> &A, int B) {
    if(A.size()==0){
        return -1;
    }
    int pivot=findPivot(A);
    if(pivot==-1){
        return bin(A,B,0,A.size()-1);
    }
    if(A[pivot]==B){
        return pivot;
    }else if(A[pivot]>B && A[0]<=B){
        return bin(A,B,0,pivot);
    }else if(A[pivot+1]<=B && A[A.size()-1]>=B){
        return bin(A,B,pivot+1,A.size()-1);
    }else{
        return -1;
    }
}


int main(){
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        vector<int> a(n);
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        int x;
        cin>>x;
        cout<<searchInRotatedArray(a,x)<<endl;
    }
    return 0;
}