<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>>& arr) {
        int n = arr.size();

        int max = INT_MIN;
        int min = INT_MAX;
        vector<int> mini;
        vector<int> maxi;
        int fm = -1, sm = -1;
        int fx = -1, sx = -1;

        for (int i = 0; i < n; i++) {
            int temp = arr[i].size();
            mini.push_back(arr[i][0]);
            maxi.push_back(arr[i][temp - 1]);
        }

        for (int i = 0; i < mini.size(); i++) {

            if (mini[i] < min) {
                sm = fm;
                fm = i;
                min = mini[i];
            } else if (sm == -1 || mini[i] < mini[sm]) {
                sm = i;
            }

            if (maxi[i] > max) {
                sx = fx;
                fx = i;
                max = maxi[i];
            } else if (sx == -1 || maxi[i] > maxi[sx]) {
                sx = i;
            }
        }

        if (fm != fx) {
            return abs(mini[fm] - maxi[fx]);
        } else {

            int k = (sm != -1) ? abs(mini[sm] - maxi[fx]) : INT_MIN;
            int s = (sx != -1) ? abs(mini[fm] - maxi[sx]) : INT_MIN;

            return (k > s) ? k : s;
        }
    }
};
113439