<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 UnionFind:
    def __init__(self, size):
        self.parent = list(range(size))
        self.rank = [1] * size
        self.connections = [1] * size

    def find(self, p):
        if self.parent[p] != p:
            self.parent[p] = self.find(self.parent[p])  # Path compression
        return self.parent[p]

    def union(self, p, q):

        rootP = self.find(p)
        rootQ = self.find(q)

        if self.rank[rootP] > self.rank[rootQ]:
            self.parent[rootQ] = rootP
            self.connections[rootP] += self.connections[rootQ]

            return self.connections[rootP]

        if self.rank[rootP] < self.rank[rootQ]:
            self.parent[rootP] = rootQ
            self.connections[rootQ] += self.connections[rootP]

            return self.connections[rootQ]

        self.parent[rootQ] = rootP
        self.rank[rootP] += 1
        self.connections[rootP] += self.connections[rootQ]

        return self.connections[rootP]

class Solution:
    def validSubarraySize(self, nums: List[int], threshold: int) -> int:

        uf = UnionFind(len(nums))

        nums = [(num, i) for i, num in enumerate(nums)]
        nums.sort(reverse=True)

        seen = [False] * len(nums)

        for num, i in nums:

            seen[i] = True
            group = 1

            if i > 0 and seen[i-1]:
                group = uf.union(i, i-1)
            if i < len(nums)-1 and seen[i+1]:
                group = uf.union(i, i+1)

            if num > threshold/group:
                return group

        return -1

        
38200