<p>You are given <code>m</code> <code>arrays</code>, where each array is sorted in <strong>ascending order</strong>.</p>

<p>You can pick up two integers from two different arrays (each array picks one) and calculate the distance. We define the distance between two integers <code>a</code> and <code>b</code> to be their absolute difference <code>|a - b|</code>.</p>

<p>Return <em>the maximum distance</em>.</p>

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

<pre>
<strong>Input:</strong> arrays = [[1,2,3],[4,5],[1,2,3]]
<strong>Output:</strong> 4
<strong>Explanation:</strong> One way to reach the maximum distance 4 is to pick 1 in the first or third array and pick 5 in the second array.
</pre>

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

<pre>
<strong>Input:</strong> arrays = [[1],[1]]
<strong>Output:</strong> 0
</pre>

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

<ul>
	<li><code>m == arrays.length</code></li>
	<li><code>2 &lt;= m &lt;= 10<sup>5</sup></code></li>
	<li><code>1 &lt;= arrays[i].length &lt;= 500</code></li>
	<li><code>-10<sup>4</sup> &lt;= arrays[i][j] &lt;= 10<sup>4</sup></code></li>
	<li><code>arrays[i]</code> is sorted in <strong>ascending order</strong>.</li>
	<li>There will be at most <code>10<sup>5</sup></code> integers in all the arrays.</li>
</ul>

class Solution {
public:
    int maxDistance(vector<vector<int>>& arrays) {
        vector<pair<int, int>> elements; // To store the first and last element of each array with indices
        
        // Add the smallest and largest elements from each array with their respective index
        for (int i = 0; i < arrays.size(); ++i) {
            elements.push_back({arrays[i][0], i}); // Add the smallest element of array i
            elements.push_back({arrays[i].back(), i}); // Add the largest element of array i
        }
        
        // Sort the elements based on the values
        sort(elements.begin(), elements.end());

        // Recursive function to compute the maximum difference
        function<int(int, int)> getMaxDiff = [&](int i, int j) -> int {
            // Base case: if the two elements belong to different arrays
            if (elements[i].second != elements[j].second) {
                return abs(elements[j].first - elements[i].first);
            }
            
            // Recursive cases: move pointers
            int option1 = (i + 1 < j) ? getMaxDiff(i + 1, j) : 0;
            int option2 = (i < j - 1) ? getMaxDiff(i, j - 1) : 0;
            
            return max(option1, option2);
        };
        
        // Start recursion with the first and last element in the sorted list
        return getMaxDiff(0, elements.size() - 1);
    }
};

118468