#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define FOR(i,a,b) for (int i = (a); i < (b); ++i) #define FOR2(i,a,b) for (int i = (a); i > (b); ++i) #define DEBUG(x) cout << '>' << #x << ':' << x << endl; inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; } const int INF = 1<<29; typedef long long ll; ////////////////////////////////////////////////////////////////////////////// const int MAX = 2047; int in[MAX][MAX]; int main() { while (1) { int R, C; scanf("%d%d", &R, &C); if (!R && !C) break; FOR(i, 0, R) FOR(j, 0, C) scanf("%d", &in[i][j]); int res = 1; //vertikalne pruhy FOR(i, 0, R-res) FOR(j, 0, C-res) { int K = in[i][j+1] - in[i][j], S = in[i][j]-j*K; int size = 1; while (i+size < R && j+size < C) { bool ok = true; FOR(k, i, i+size+1) if (in[k][j+size] != S+K*(j+size)) { ok = false; break; } FOR(k, j, j+size+1) if (in[i+size][k] != S+K*k) { ok = false; break; } if (!ok) break; res = max(res, ++size); } } //horizontalne pruhy FOR(i, 0, R-res) FOR(j, 0, C-res) { int K = in[i+1][j] - in[i][j], S = in[i][j]-i*K; int size = 1; while (i+size < R && j+size < C) { bool ok = true; FOR(k, i, i+size+1) if (in[k][j+size] != S+K*k) { ok = false; break; } FOR(k, j, j+size+1) if (in[i+size][k] != S+K*(i+size)) { ok = false; break; } if (!ok) break; res = max(res, ++size); } } //diagonalne pruhy Q=1 FOR(i, 0, R-res) FOR(j, 0, C-res) { int K = in[i+1][j] - in[i][j], S = in[i][j]-(i+j)*K; int size = 1; while (i+size < R && j+size < C) { bool ok = true; FOR(k, i, i+size+1) if (in[k][j+size] != S+K*(k+j+size)) { ok = false; break; } FOR(k, j, j+size+1) if (in[i+size][k] != S+K*(i+size+k)) { ok = false; break; } if (!ok) break; res = max(res, ++size); } } //diagonalne pruhy Q=1 FOR(i, 0, R-res) FOR(j, 0, C-res) { int K = in[i+1][j] - in[i][j], S = in[i][j]-(i-j)*K; int size = 1; while (i+size < R && j+size < C) { bool ok = true; FOR(k, i, i+size+1) if (in[k][j+size] != S+K*(k-j-size)) { ok = false; break; } FOR(k, j, j+size+1) if (in[i+size][k] != S+K*(i+size-k)) { ok = false; break; } if (!ok) break; res = max(res, ++size); } } printf("%d\n", res*res); } return 0; }