<p>You are given an integer array <code>nums</code> and an integer <code>threshold</code>.</p>

<p>Find any subarray of <code>nums</code> of length <code>k</code> such that <strong>every</strong> element in the subarray is <strong>greater</strong> than <code>threshold / k</code>.</p>

<p>Return<em> the <strong>size</strong> of <strong>any</strong> such subarray</em>. If there is no such subarray, return <code>-1</code>.</p>

<p>A <strong>subarray</strong> is a contiguous non-empty sequence of elements within an array.</p>

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

<pre>
<strong>Input:</strong> nums = [1,3,4,3,1], threshold = 6
<strong>Output:</strong> 3
<strong>Explanation:</strong> The subarray [3,4,3] has a size of 3, and every element is greater than 6 / 3 = 2.
Note that this is the only valid subarray.
</pre>

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

<pre>
<strong>Input:</strong> nums = [6,5,6,5,8], threshold = 7
<strong>Output:</strong> 1
<strong>Explanation:</strong> The subarray [8] has a size of 1, and 8 &gt; 7 / 1 = 7. So 1 is returned.
Note that the subarray [6,5] has a size of 2, and every element is greater than 7 / 2 = 3.5. 
Similarly, the subarrays [6,5,6], [6,5,6,5], [6,5,6,5,8] also satisfy the given conditions.
Therefore, 2, 3, 4, or 5 may also be returned.</pre>

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

<ul>
	<li><code>1 &lt;= nums.length &lt;= 10<sup>5</sup></code></li>
	<li><code>1 &lt;= nums[i], threshold &lt;= 10<sup>9</sup></code></li>
</ul>

class Solution:
    def validSubarraySize(self, nums: List[int], threshold: int) -> int:
        '''
        Tư duy ra bài giải:
        - Với 1 threshold cho trước, khi k càng tăng thì threshold / k càng giảm.
        - 1 subarray mà thỏa mãn đề bài khi và chỉ khi min của subarray đó thỏa mãn đề bài
        - Gỉa sử bây giờ cho trước min, ta có thể tìm được subarray dài nhất mà có giá trị min đó không. Có
        - Khi đó thì nếu min > threshold / k thì every element trong cái subarray đó cũng lớn hơn threshold / k
        '''

        # Tìm ra phần tử bé hơn bên trái của 1 phần tử at index i, và phần tử bé hơn bên phải cũng at index i
        # Nếu min > threshold / k thì return ra kết quả
        # Các phần tử trong vùng left + 1 -> right - 1 có min là phần tử at index i

        n = len(nums)
        leftSmaller = [-1] * n
        rightSmaller = [n] * n

        st = deque()
        for i in range(n):
            if len(st) == 0:
                st.append(i)
            else:
                while st and nums[st[-1]] >= nums[i]:
                    st.pop()
                leftSmaller[i] = st[-1] if st else -1
                st.append(i)


        st = deque()
        for i in range(n-1, -1, -1):
            if len(st) == 0:
                st.append(i)
            else:
                while st and nums[st[-1]] >= nums[i]:
                    st.pop()
                rightSmaller[i] = st[-1] if st else n
                st.append(i)

        ans = -1
        print(leftSmaller)
        print(rightSmaller)
        for i in range(n):
            size = rightSmaller[i] - 1 - (leftSmaller[i] + 1) + 1
            if size != 0 and nums[i] > threshold / size:
                ans = max(size, ans)
        return ans 
1077