#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ii pair<int,int>
#define F first
#define S second
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, -1, 0, 1};
// Function to check if a cell has valid neighboring cells
bool check(vector<vector<int>>& matrix, ii it, int m, int n) {
for (int i = 0; i < 4; i++) {
if (it.F + dx[i] < 0 || it.F + dx[i] >= m || it.S + dy[i] < 0 || it.S + dy[i] >= n)
continue;
if (matrix[it.F + dx[i]][it.S + dy[i]] > matrix[it.F][it.S]) return true;
}
return false;
}
// Function to get the neighboring cells of a given cell
vector<ii> neighbours(vector<vector<int>>& matrix, ii it, int m, int n) {
vector<ii> neigh;
for (int i = 0; i < 4; i++) {
if (it.F + dx[i] < 0 || it.F + dx[i] >= m || it.S + dy[i] < 0 || it.S + dy[i] >= n)
continue;
neigh.push_back({it.F + dx[i], it.S + dy[i]});
}
return neigh;
}
// Memoization to avoid recalculating subproblems
vector<vector<int>> dp;
int dfs(vector<vector<int>>& matrix, int m, int n, ii it) {
if (dp[it.F][it.S] != -1) return dp[it.F][it.S]; // Already computed
int longest = 1;
for (auto v : neighbours(matrix, it, m, n)) {
if (matrix[v.F][v.S] > matrix[it.F][it.S]) {
longest = max(longest, 1 + dfs(matrix, m, n, v));
}
}
return dp[it.F][it.S] = longest;
}
int longestIncreasingPath(vector<vector<int>>& matrix) {
if (matrix.empty() || matrix[0].empty()) return 0;
int m = matrix.size(), n = matrix[0].size();
dp = vector<vector<int>>(m, vector<int>(n, -1)); // Initialize dp table
int result = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (dp[i][j] == -1) { // If not visited
result = max(result, dfs(matrix, m, n, {i, j}));
}
}
}
return result;
}
int32_t main() {
int m, n;
cin >> m >> n;
vector<vector<int>> matrix(m, vector<int>(n));
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> matrix[i][j];
}
}
cout << longestIncreasingPath(matrix) << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGlpIHBhaXI8aW50LGludD4KI2RlZmluZSBGIGZpcnN0CiNkZWZpbmUgUyBzZWNvbmQKCiAgICBpbnQgZHhbNF0gPSB7MSwgMCwgLTEsIDB9OwogICAgaW50IGR5WzRdID0gezAsIC0xLCAwLCAxfTsKCiAgICAvLyBGdW5jdGlvbiB0byBjaGVjayBpZiBhIGNlbGwgaGFzIHZhbGlkIG5laWdoYm9yaW5nIGNlbGxzCiAgICBib29sIGNoZWNrKHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIG1hdHJpeCwgaWkgaXQsIGludCBtLCBpbnQgbikgewogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpdC5GICsgZHhbaV0gPCAwIHx8IGl0LkYgKyBkeFtpXSA+PSBtIHx8IGl0LlMgKyBkeVtpXSA8IDAgfHwgaXQuUyArIGR5W2ldID49IG4pCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgaWYgKG1hdHJpeFtpdC5GICsgZHhbaV1dW2l0LlMgKyBkeVtpXV0gPiBtYXRyaXhbaXQuRl1baXQuU10pIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gRnVuY3Rpb24gdG8gZ2V0IHRoZSBuZWlnaGJvcmluZyBjZWxscyBvZiBhIGdpdmVuIGNlbGwKICAgIHZlY3RvcjxpaT4gbmVpZ2hib3Vycyh2ZWN0b3I8dmVjdG9yPGludD4+JiBtYXRyaXgsIGlpIGl0LCBpbnQgbSwgaW50IG4pIHsKICAgICAgICB2ZWN0b3I8aWk+IG5laWdoOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpdC5GICsgZHhbaV0gPCAwIHx8IGl0LkYgKyBkeFtpXSA+PSBtIHx8IGl0LlMgKyBkeVtpXSA8IDAgfHwgaXQuUyArIGR5W2ldID49IG4pCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgbmVpZ2gucHVzaF9iYWNrKHtpdC5GICsgZHhbaV0sIGl0LlMgKyBkeVtpXX0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmVpZ2g7CiAgICB9CgogICAgLy8gTWVtb2l6YXRpb24gdG8gYXZvaWQgcmVjYWxjdWxhdGluZyBzdWJwcm9ibGVtcwogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBkcDsKCiAgICBpbnQgZGZzKHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIG1hdHJpeCwgaW50IG0sIGludCBuLCBpaSBpdCkgewogICAgICAgIGlmIChkcFtpdC5GXVtpdC5TXSAhPSAtMSkgcmV0dXJuIGRwW2l0LkZdW2l0LlNdOyAvLyBBbHJlYWR5IGNvbXB1dGVkCgogICAgICAgIGludCBsb25nZXN0ID0gMTsKICAgICAgICBmb3IgKGF1dG8gdiA6IG5laWdoYm91cnMobWF0cml4LCBpdCwgbSwgbikpIHsKICAgICAgICAgICAgaWYgKG1hdHJpeFt2LkZdW3YuU10gPiBtYXRyaXhbaXQuRl1baXQuU10pIHsKICAgICAgICAgICAgICAgIGxvbmdlc3QgPSBtYXgobG9uZ2VzdCwgMSArIGRmcyhtYXRyaXgsIG0sIG4sIHYpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZHBbaXQuRl1baXQuU10gPSBsb25nZXN0OwogICAgfQoKICAgIGludCBsb25nZXN0SW5jcmVhc2luZ1BhdGgodmVjdG9yPHZlY3RvcjxpbnQ+PiYgbWF0cml4KSB7CiAgICAgICAgaWYgKG1hdHJpeC5lbXB0eSgpIHx8IG1hdHJpeFswXS5lbXB0eSgpKSByZXR1cm4gMDsKICAgICAgICAKICAgICAgICBpbnQgbSA9IG1hdHJpeC5zaXplKCksIG4gPSBtYXRyaXhbMF0uc2l6ZSgpOwogICAgICAgIGRwID0gdmVjdG9yPHZlY3RvcjxpbnQ+PihtLCB2ZWN0b3I8aW50PihuLCAtMSkpOyAvLyBJbml0aWFsaXplIGRwIHRhYmxlCiAgICAgICAgCiAgICAgICAgaW50IHJlc3VsdCA9IDA7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgICAgIGlmIChkcFtpXVtqXSA9PSAtMSkgeyAvLyBJZiBub3QgdmlzaXRlZAogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1heChyZXN1bHQsIGRmcyhtYXRyaXgsIG0sIG4sIHtpLCBqfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgppbnQzMl90IG1haW4oKSB7CiAgICBpbnQgbSwgbjsgCiAgICBjaW4gPj4gbSA+PiBuOwogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBtYXRyaXgobSwgdmVjdG9yPGludD4obikpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyBpKyspIHsKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICBjaW4gPj4gbWF0cml4W2ldW2pdOwogICAgICAgIH0KICAgIH0KICAgIGNvdXQgPDwgbG9uZ2VzdEluY3JlYXNpbmdQYXRoKG1hdHJpeCkgPDwgZW5kbDsKICAgIHJldHVybiAwOwp9Cg==