<p><em>(This problem is an <strong>interactive problem</strong>.)</em></p>

<p>You may recall that an array <code>arr</code> is a <strong>mountain array</strong> if and only if:</p>

<ul>
	<li><code>arr.length &gt;= 3</code></li>
	<li>There exists some <code>i</code> with <code>0 &lt; i &lt; arr.length - 1</code> such that:
	<ul>
		<li><code>arr[0] &lt; arr[1] &lt; ... &lt; arr[i - 1] &lt; arr[i]</code></li>
		<li><code>arr[i] &gt; arr[i + 1] &gt; ... &gt; arr[arr.length - 1]</code></li>
	</ul>
	</li>
</ul>

<p>Given a mountain array <code>mountainArr</code>, return the <strong>minimum</strong> <code>index</code> such that <code>mountainArr.get(index) == target</code>. If such an <code>index</code> does not exist, return <code>-1</code>.</p>

<p><strong>You cannot access the mountain array directly.</strong> You may only access the array using a <code>MountainArray</code> interface:</p>

<ul>
	<li><code>MountainArray.get(k)</code> returns the element of the array at index <code>k</code> (0-indexed).</li>
	<li><code>MountainArray.length()</code> returns the length of the array.</li>
</ul>

<p>Submissions making more than <code>100</code> calls to <code>MountainArray.get</code> will be judged <em>Wrong Answer</em>. Also, any solutions that attempt to circumvent the judge will result in disqualification.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> array = [1,2,3,4,5,3,1], target = 3
<strong>Output:</strong> 2
<strong>Explanation:</strong> 3 exists in the array, at index=2 and index=5. Return the minimum index, which is 2.</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> array = [0,1,2,4,2,1], target = 3
<strong>Output:</strong> -1
<strong>Explanation:</strong> 3 does not exist in <code>the array,</code> so we return -1.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>3 &lt;= mountain_arr.length() &lt;= 10<sup>4</sup></code></li>
	<li><code>0 &lt;= target &lt;= 10<sup>9</sup></code></li>
	<li><code>0 &lt;= mountain_arr.get(index) &lt;= 10<sup>9</sup></code></li>
</ul>

# """
# This is MountainArray's API interface.
# You should not implement it, or speculate about its implementation
# """
#class MountainArray:
#    def get(self, index: int) -> int:
#    def length(self) -> int:

class Solution:
    def findInMountainArray(self, target: int, mountain_arr: 'MountainArray') -> int:
        length=mountain_arr.length()
        a=1
        b=length-2
        peak=-1

        def binary_search(start,end,target):
            while start<=end:
                mid=(start+end)//2
                if mountain_arr.get(mid)==target:
                    return mid
                elif mountain_arr.get(mid)>target:
                    end=mid-1
                else:
                    start=mid+1
            return -1
        
        def binary_search_opp(start,end,target):
            while start<=end:
                mid=(start+end)//2
                mid_value=mountain_arr.get(mid)
                # print(f"start,end, mid and mountain_arr.get(mid) {start,end, mid, mountain_arr.get(mid)}")
                if mid_value==target:
                    return mid
                elif mid_value>target:
                    start=mid+1
                else:
                    end=mid-1
            return -1
                    


        while a<=b:
            mid=(a+b)//2
            mid_value=mountain_arr.get(mid)
            if mid_value>mountain_arr.get(mid-1) and mid_value>mountain_arr.get(mid+1):
                peak=mid
                break
            elif mountain_arr.get(mid-1)<=mid_value and mountain_arr.get(mid+1)>=mid_value:
                a=mid+1
            else:
                b=mid-1
        
        
        # print(f"peak value is {mountain_arr.get(peak)} at index {peak}")


        # if target>=mountain_arr.get(0) and  target<=mountain_arr.get(peak):
        left_output=binary_search(0,peak,target)
        right_output=binary_search_opp(peak,length-1,target)
        
        if left_output==-1:
            return right_output
        else:
            return left_output

                
                       
17100