<p>Given a <strong>1-indexed</strong>&nbsp;<code>m x n</code> integer matrix <code>mat</code>, you can select any cell in the matrix as your <strong>starting cell</strong>.</p>

<p>From the starting cell, you can move to any other cell <strong>in the</strong> <strong>same row or column</strong>, but only if the value of the destination cell is <strong>strictly greater</strong> than the value of the current cell. You can repeat this process as many times as possible, moving from cell to cell until you can no longer make any moves.</p>

<p>Your task is to find the <strong>maximum number of cells</strong> that you can visit in the matrix by starting from some cell.</p>

<p>Return <em>an integer denoting the maximum number of cells that can be visited.</em></p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<p><strong class="example"><img alt="" src="https://assets.leetcode.com/uploads/2023/04/23/diag1drawio.png" style="width: 200px; height: 176px;" /></strong></p>

<pre>
<strong>Input:</strong> mat = [[3,1],[3,4]]
<strong>Output:</strong> 2
<strong>Explanation:</strong> The image shows how we can visit 2 cells starting from row 1, column 2. It can be shown that we cannot visit more than 2 cells no matter where we start from, so the answer is 2. 
</pre>

<p><strong class="example">Example 2:</strong></p>

<p><strong class="example"><img alt="" src="https://assets.leetcode.com/uploads/2023/04/23/diag3drawio.png" style="width: 200px; height: 176px;" /></strong></p>

<pre>
<strong>Input:</strong> mat = [[1,1],[1,1]]
<strong>Output:</strong> 1
<strong>Explanation:</strong> Since the cells must be strictly increasing, we can only visit one cell in this example. 
</pre>

<p><strong class="example">Example 3:</strong></p>

<p><strong class="example"><img alt="" src="https://assets.leetcode.com/uploads/2023/04/23/diag4drawio.png" style="width: 350px; height: 250px;" /></strong></p>

<pre>
<strong>Input:</strong> mat = [[3,1,6],[-9,5,7]]
<strong>Output:</strong> 4
<strong>Explanation:</strong> The image above shows how we can visit 4 cells starting from row 2, column 1. It can be shown that we cannot visit more than 4 cells no matter where we start from, so the answer is 4. 
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>m == mat.length&nbsp;</code></li>
	<li><code>n == mat[i].length&nbsp;</code></li>
	<li><code>1 &lt;= m, n &lt;= 10<sup>5</sup></code></li>
	<li><code>1 &lt;= m * n &lt;= 10<sup>5</sup></code></li>
	<li><code>-10<sup>5</sup>&nbsp;&lt;= mat[i][j] &lt;= 10<sup>5</sup></code></li>
</ul>

class Solution:
    def maxIncreasingCells(self, mat: List[List[int]]) -> int:
        r = [[] for _ in mat]
        c = [[] for _ in range(len(mat[0]))]
        h = []
        for i, row in enumerate(mat):
            for j, x in enumerate(row):
                heapq.heappush(r[i], (x, j))
                heapq.heappush(c[j], (x, i))
                heapq.heappush(h, (x, i, j))
        a = [[1 for _ in r] for r in mat]
        while h:
            v, i, j = heapq.heappop(h)
            di = {i: a[i][j]}
            dj = {j: a[i][j]}
            while h and h[0][0] == v:
                _, i, j = heapq.heappop(h)
                di[i] = max(di.get(i, 1), a[i][j])
                dj[j] = max(dj.get(j, 1), a[i][j])
            for j in dj:
                while c[j] and c[j][0][0] <= v:
                    heapq.heappop(c[j])
                if c[j]:
                    p = c[j][0][0]
                    while c[j] and c[j][0][0] == p:
                        cv, ci = heapq.heappop(c[j])
                        a[ci][j] = max(a[ci][j], dj[j] + 1)
            for i in di:
                while r[i] and r[i][0][0] <= v:
                    heapq.heappop(r[i])
                if r[i]:
                    p = r[i][0][0]
                    while r[i] and r[i][0][0] == p:
                        rv, rj = heapq.heappop(r[i])
                        a[i][rj] = max(a[i][rj], di[i] + 1)
        m = 0
        for i, row in enumerate(a):
            m = max(max(row), m)
        return m
2520