<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) {
        int n = arrays.size();
        vector<int> mini;
        vector<int> maxi;
        
        for(int i=0; i<n; i++){
            mini.push_back(arrays[i][0]);
            maxi.push_back(arrays[i][arrays[i].size()-1]);
        }

        vector<int> preMin(n), preMax(n), postMin(n), postMax(n);

        preMin[0] = mini[0]; preMax[0] = maxi[0];
        postMin[n-1] = mini[n-1]; postMax[n-1] = maxi[n-1];

        for(int i=1; i<n; i++){
            preMin[i] = min(preMin[i-1], mini[i]);
            preMax[i] = max(preMax[i-1], maxi[i]);
        }

        for(int i=n-2; i>=0; i--){
            postMin[i] = min(postMin[i+1], mini[i]);
            postMax[i] = max(postMax[i+1], maxi[i]);
        }
        
        int result = max({abs(mini[0]-postMax[1]), 
                        abs(maxi[0]-postMin[1]), 
                        abs(mini[n-1]-preMax[n-2]), 
                        abs(maxi[n-1]-preMin[n-2])});

        
        for(int i=1; i<n-1; i++){
            result = max({result, abs(maxi[i]-preMin[i-1]), abs(maxi[i]-postMin[i+1]),
                            abs(mini[i]-preMax[i-1]), abs(mini[i]-postMax[i+1])});
        }
            

        return result;
    }
};

//-1,-3,-2
//1,4,4
//4,4,2
// 1, 4, 2
//-1,-3,-3
//-3,-3,-2
117909