<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(std::vector<std::vector<int>> &arrays) {
	    std::priority_queue<std::pair<int, int>, std::deque<std::pair<int, int>>> max{};
	    std::priority_queue<std::pair<int, int>, std::deque<std::pair<int, int>>, std::greater<std::pair<int, int>>> min{};
	    for(int i = 0; i < arrays.size(); i++) {
		    max.push({*arrays[i].rbegin(), i});
		    min.push({*arrays[i].begin(), i});
	    }
	    auto top_max = max.top(), top_min = min.top();
	    max.pop();
	    min.pop();
	    while(top_max.second == top_min.second) {
		    if(max.empty()) {
			top_min = min.top();
			min.pop();
		    } else if(min.empty()) {
			top_max = max.top();
			max.pop();
		    } else {
			auto option1 = std::abs(max.top().first - top_min.first);
			auto option2 = std::abs(min.top().first - top_max.first);
		    	if(option1 > option2) {
				top_max = max.top();
				max.pop();
			} else if(option1 < option2) {
				top_min = min.top();
				min.pop();
			} else {
				return option1;
			}
		    }
	    }
	    return std::abs(top_max.first - top_min.first);
    }
};
115860