#include #include #include using namespace std; using vi = vector; using vvi = vector; using vvvi = vector; using vvvvi = vector; int inf = 1e9; int m, n; vvi b; vvi bb; // d[to][from]: steps to go from from to to. vvvvi d; void dfs(int i0, int j0, int i1, int j1, int target, int depth) { auto& dto = d[i0][j0]; if(dto[i1][j1] < inf) { return; } if(depth == m * n) { dto[i1][j1] = inf - 1; return; } // Compute parent of (i1,j1). pair, pair> best{{inf, inf}, {0, 0}}; for(auto [di, dj] : {std::pair{0, 1}, {0, -1}, {1, 0}, {-1, 0}}) { auto ip = i1 + di; auto jp = j1 + dj; if(ip < 0 or jp < 0 or ip >= m or jp >= n) { continue; } auto diff1 = abs(b[ip][jp] - target); auto diff2 = abs(b[ip][jp] - b[i1][j1]); best = min(best, {{diff1, diff2}, {ip, jp}}); } if(best.first.first == inf) { dto[i1][j1] = inf - 1; bb[i1][j1] = inf; return; } dfs(i0, j0, best.second.first, best.second.second, target, depth + 1); dto[i1][j1] = dto[best.second.first][best.second.second] + 1; bb[i1][j1] = max(bb[i1][j1], dto[i1][j1]); // cerr << "Distance from " << b[i1][j1] << " to " << b[i0][j0] << " = " << dto[i1][j1] << endl; } int main() { cin >> m >> n; b = vvi(m, vi(n)); for(auto& v : b) for(auto& x : v) cin >> x; // d[to][from]: steps to go from from to to. d = vvvvi(m, vvvi(n, vvi(m, vi(n, inf)))); bb = vvi(m, vi(n, 0)); for(int i0 = 0; i0 < m; ++i0) { for(int j0 = 0; j0 < n; ++j0) { // Get distances to i0 j0 d[i0][j0][i0][j0] = 0; } } for(int i0 = 0; i0 < m; ++i0) { for(int j0 = 0; j0 < n; ++j0) { for(int i1 = 0; i1 < m; ++i1) { for(int j1 = 0; j1 < n; ++j1) { dfs(i0, j0, i1, j1, b[i0][j0], 0); } } } } pair ans{inf, -1}; for(int i1 = 0; i1 < m; ++i1) { for(int j1 = 0; j1 < n; ++j1) { ans = min(ans, {bb[i1][j1], b[i1][j1]}); } } if(ans.first == inf) { cout << "impossible\n"; } else { cout << ans.second << ' ' << ans.first << endl; } }