<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) {
        ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
        vector<int> pmns(arrays.size());
        vector<int> pmxs(arrays.size());
        vector<int> smns(arrays.size());
        vector<int> smxs(arrays.size());
        vector<pair<int, int>> res(arrays.size());
        pmns[0] = arrays[0][0];
        pmxs[0] = arrays[0][arrays[0].size() - 1];
        smns[arrays.size() - 1] = arrays[arrays.size() - 1][0];
        smxs[arrays.size() - 1] = arrays[arrays.size() - 1][arrays[arrays.size() - 1].size() - 1];
        for (int i = 1; i < arrays.size(); i++) {
            pmns[i] = min(arrays[i][0], pmns[i - 1]);
            pmxs[i] = max(arrays[i][arrays[i].size() - 1], pmxs[i - 1]);
        }
        for (int i = arrays.size() - 2; i >= 0; i--) {
            smns[i] = min(arrays[i][0], smns[i + 1]);
            smxs[i] = max(arrays[i][arrays[i].size() - 1], smxs[i + 1]);
        }
        int ans = INT_MIN;
        for (int i = 0; i < arrays.size(); i++) {
            if (i == 0) {
                res[i] = make_pair(smns[i + 1], smxs[i + 1]);
                ans = max({ans, abs(res[i].second - arrays[i][0]), abs(res[i].first - arrays[i][arrays[i].size() - 1])});
                continue;
            }
            if (i == arrays.size() - 1) {
                res[i] = make_pair(pmns[i - 1], pmxs[i - 1]);
                ans = max({ans, abs(res[i].second - arrays[i][0]), abs(res[i].first - arrays[i][arrays[i].size() - 1])});
                continue;
            }
            res[i] = make_pair(min(pmns[i - 1], smns[i + 1]), max(pmxs[i - 1], smxs[i + 1]));
            ans = max({ans, abs(res[i].second - arrays[i][0]), abs(res[i].first - arrays[i][arrays[i].size() - 1])});
        }
        return ans;
    }
};
114556