<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) {
        if (arrays.size() < 2) {
            return 0;
        }

        std::stack<std::pair<int, int>> minmax_right;
        for (size_t i = arrays.size(); i != 1; --i) {
            minmax_right.push({
                std::min(arrays[i - 1].front(), !minmax_right.empty() ? minmax_right.top().first : INT_MAX), 
                std::max(arrays[i - 1].back(), !minmax_right.empty() ? minmax_right.top().second : INT_MIN)
            });
        }
        
        int min_left = INT_MAX;
        int max_left = INT_MIN;
        int result = INT_MIN;
        for (const auto& array : arrays) {
            const int min_right = !minmax_right.empty() ? minmax_right.top().first : INT_MAX;
            const int max_right = !minmax_right.empty() ? minmax_right.top().second : INT_MIN;
            if (!minmax_right.empty()) {
                minmax_right.pop();
            }

            result = std::max({
                result,
                std::abs(std::max(max_left, max_right) - array.front()),
                std::abs(array.back() - std::min(min_left, min_right))
            });
            min_left = std::min(min_left, array.front());
            max_left = std::max(max_left, array.back());
        }
        return result;
    }
};
110831