<p>You are given an integer array <code>nums</code> and an integer <code>k</code>. Find the maximum subarray sum of all the subarrays of <code>nums</code> that meet the following conditions:</p>

<ul>
	<li>The length of the subarray is <code>k</code>, and</li>
	<li>All the elements of the subarray are <strong>distinct</strong>.</li>
</ul>

<p>Return <em>the maximum subarray sum of all the subarrays that meet the conditions</em><em>.</em> If no subarray meets the conditions, return <code>0</code>.</p>

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

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

<pre>
<strong>Input:</strong> nums = [1,5,4,2,9,9,9], k = 3
<strong>Output:</strong> 15
<strong>Explanation:</strong> The subarrays of nums with length 3 are:
- [1,5,4] which meets the requirements and has a sum of 10.
- [5,4,2] which meets the requirements and has a sum of 11.
- [4,2,9] which meets the requirements and has a sum of 15.
- [2,9,9] which does not meet the requirements because the element 9 is repeated.
- [9,9,9] which does not meet the requirements because the element 9 is repeated.
We return 15 because it is the maximum subarray sum of all the subarrays that meet the conditions
</pre>

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

<pre>
<strong>Input:</strong> nums = [4,4,4], k = 3
<strong>Output:</strong> 0
<strong>Explanation:</strong> The subarrays of nums with length 3 are:
- [4,4,4] which does not meet the requirements because the element 4 is repeated.
We return 0 because no subarrays meet the conditions.
</pre>

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

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

class Solution:
    def maximumSubarraySum(self, nums: List[int], k: int) -> int:
        if k > len(nums):
            return 0
        # Invariant: len(nums) > k
        subarray = []
        currentSum = 0
        membership = defaultdict(int)
        maximumSum = 0
        repeated = set()

        for i in range(0, len(nums)):
            # print(subarray, currentSum, membership, repeated, maximumSum)
            # Remove 0-indexed element
            if len(subarray) == k:
                previous = subarray.pop(0)
                # print(previous)
                currentSum -= previous
                membership[previous] -= 1
                if membership[previous] == 1:
                    repeated.remove(previous)
                if membership[previous] == 0:
                    del membership[previous]

            num = nums[i]
            subarray.append(num)
            currentSum += num
            valid = True
            if num in membership:
                valid = False  
            membership[num] += 1
            if membership[num] > 1:
                repeated.add(num)
            if repeated:
                valid = False
            if len(subarray) < k:
                valid = False
            if valid:
                maximumSum = max(currentSum, maximumSum)
        return maximumSum





        # def helper(subarray, index):
        #     if index >= len(nums):
        #         return 0
        #     # Invariant: i < len(nums)
        #     if len(subarray) == k:
        #         return sum(subarray)
        #     # Invariant: len(subarray) < k
        #     maxSum = 0
        #     for i in range(index, len(nums)):
        #         if num not in subarray:
        #             subarray.add(num)
        #             s = helper(subarray, i+1)
        #             print(s, subarray)
        #             maxSum = max(maxSum, s)
        #             subarray.remove(num)
        #     return maxSum
        # return helper(set(),0)
33800