<p>You are given two <strong>0-indexed</strong> arrays <code>nums1</code> and <code>nums2</code> of length <code>n</code>, both of which are <strong>permutations</strong> of <code>[0, 1, ..., n - 1]</code>.</p>

<p>A <strong>good triplet</strong> is a set of <code>3</code> <strong>distinct</strong> values which are present in <strong>increasing order</strong> by position both in <code>nums1</code> and <code>nums2</code>. In other words, if we consider <code>pos1<sub>v</sub></code> as the index of the value <code>v</code> in <code>nums1</code> and <code>pos2<sub>v</sub></code> as the index of the value <code>v</code> in <code>nums2</code>, then a good triplet will be a set <code>(x, y, z)</code> where <code>0 &lt;= x, y, z &lt;= n - 1</code>, such that <code>pos1<sub>x</sub> &lt; pos1<sub>y</sub> &lt; pos1<sub>z</sub></code> and <code>pos2<sub>x</sub> &lt; pos2<sub>y</sub> &lt; pos2<sub>z</sub></code>.</p>

<p>Return <em>the <strong>total number</strong> of good triplets</em>.</p>

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

<pre>
<strong>Input:</strong> nums1 = [2,0,1,3], nums2 = [0,1,2,3]
<strong>Output:</strong> 1
<strong>Explanation:</strong> 
There are 4 triplets (x,y,z) such that pos1<sub>x</sub> &lt; pos1<sub>y</sub> &lt; pos1<sub>z</sub>. They are (2,0,1), (2,0,3), (2,1,3), and (0,1,3). 
Out of those triplets, only the triplet (0,1,3) satisfies pos2<sub>x</sub> &lt; pos2<sub>y</sub> &lt; pos2<sub>z</sub>. Hence, there is only 1 good triplet.
</pre>

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

<pre>
<strong>Input:</strong> nums1 = [4,0,1,3,2], nums2 = [4,1,0,2,3]
<strong>Output:</strong> 4
<strong>Explanation:</strong> The 4 good triplets are (4,0,3), (4,0,2), (4,1,3), and (4,1,2).
</pre>

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

<ul>
	<li><code>n == nums1.length == nums2.length</code></li>
	<li><code>3 &lt;= n &lt;= 10<sup>5</sup></code></li>
	<li><code>0 &lt;= nums1[i], nums2[i] &lt;= n - 1</code></li>
	<li><code>nums1</code> and <code>nums2</code> are permutations of <code>[0, 1, ..., n - 1]</code>.</li>
</ul>

class Solution:
    def goodTriplets(self, nums1, nums2):
        n = len(nums1)
        
        # Mapping each element of nums2 to its index
        index_map = {val: i for i, val in enumerate(nums2)}
        
        # Mapping each element of nums1 to its index in nums2
        nums1 = [index_map[val] for val in nums1]
        
        # Fenwick Tree (Binary Indexed Tree)
        class FenwickTree:
            def __init__(self, size):
                self.size = size
                self.tree = [0] * (size + 1)
                
            def update(self, index, value):
                while index <= self.size:
                    self.tree[index] += value
                    index += index & -index
                
            def query(self, index):
                total = 0
                while index > 0:
                    total += self.tree[index]
                    index -= index & -index
                return total
        
        # Initialize Fenwick Tree
        fenwick_tree = FenwickTree(n)
        
        # Array to store the count of elements to the right that are greater
        right_greater = [0] * n
        
        # Calculate the count of elements to the right that are greater
        for i in range(n - 1, -1, -1):
            right_greater[i] = fenwick_tree.query(n) - fenwick_tree.query(nums1[i] + 1)
            fenwick_tree.update(nums1[i] + 1, 1)
        
        # Reset Fenwick Tree
        fenwick_tree = FenwickTree(n)
        
        # Array to store the count of elements to the left that are smaller
        left_smaller = [0] * n
        
        # Calculate the count of elements to the left that are smaller
        for i in range(n):
            left_smaller[i] = fenwick_tree.query(nums1[i])
            fenwick_tree.update(nums1[i] + 1, 1)
        
        # Calculate the total number of good triplets
        total_triplets = 0
        for i in range(1, n - 1):
            total_triplets += left_smaller[i] * right_greater[i]
        
        return total_triplets

# Example usage:
solution = Solution()
nums1 = [2, 0, 1, 3]
nums2 = [0, 1, 2, 3]
print(solution.goodTriplets(nums1, nums2))  # Output: 1

nums1 = [4, 0, 1, 3, 2]
nums2 = [4, 1, 0, 2, 3]
print(solution.goodTriplets(nums1, nums2))  # Output: 4
1599