<p>Given a <strong>0-indexed</strong> integer array <code>nums</code> of size <code>n</code> containing all numbers from <code>1</code> to <code>n</code>, return <em>the number of increasing quadruplets</em>.</p>

<p>A quadruplet <code>(i, j, k, l)</code> is increasing if:</p>

<ul>
	<li><code>0 &lt;= i &lt; j &lt; k &lt; l &lt; n</code>, and</li>
	<li><code>nums[i] &lt; nums[k] &lt; nums[j] &lt; nums[l]</code>.</li>
</ul>

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

<pre>
<strong>Input:</strong> nums = [1,3,2,4,5]
<strong>Output:</strong> 2
<strong>Explanation:</strong> 
- When i = 0, j = 1, k = 2, and l = 3, nums[i] &lt; nums[k] &lt; nums[j] &lt; nums[l].
- When i = 0, j = 1, k = 2, and l = 4, nums[i] &lt; nums[k] &lt; nums[j] &lt; nums[l]. 
There are no other quadruplets, so we return 2.
</pre>

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

<pre>
<strong>Input:</strong> nums = [1,2,3,4]
<strong>Output:</strong> 0
<strong>Explanation:</strong> There exists only one quadruplet with i = 0, j = 1, k = 2, l = 3, but since nums[j] &lt; nums[k], we return 0.
</pre>

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

<ul>
	<li><code>4 &lt;= nums.length &lt;= 4000</code></li>
	<li><code>1 &lt;= nums[i] &lt;= nums.length</code></li>
	<li>All the integers of <code>nums</code> are <strong>unique</strong>. <code>nums</code> is a permutation.</li>
</ul>

class Solution:
    def countQuadruplets(self, nums: List[int]) -> int:
        n=len(nums)
        lst=[nums[0]]
        lsts=[()]
        for j in range(1, n):
            ind=bisect_right(lst, nums[j])
            lsts.append(tuple(lst[:ind]))
            lst.insert(ind, nums[j])
        
        lst=[nums[n-1]]
        ct2=[0]
        lsts2=[()]
        for k in range(n-2, -1, -1):
            ind=bisect_left(lst, nums[k])
            ct2.append(n-1-k-ind)
            lsts2.append(tuple(lst[ind:]))
            lst.insert(ind, nums[k])
        ct2.reverse()
        lsts2.reverse()

        ans=0       
        for k in range(2, n-1):
            nk=nums[k]
            tmp_ct=ct2[k]
            tmp_lst=lsts2[k]
            for j in range(1, k):
                if nk<nums[j]:
                    ans+=bisect_right(lsts[j], nk)*(tmp_ct-bisect_left(tmp_lst, nums[j]))
        return ans
80000