#include #include #include #include #include #include using namespace std; typedef unsigned long long L; int n,m; int map[2222][2222]; int p[2222][2222]; int p2[2222][2222]; int best; int TX[2222][2222]; bool match(int d, int &x) { if(x==1<<20 || x==d) { x = d; return true; } else { x = d; return false; } } void dod() { // diagonal same for(int i=0; i < m+n+1; ++i) { int same; for(int j = 0; j < m; ++j) { if(i-j < 0 || i-j >= n) continue; if(j>0 && map[i-j][j] == map[i-(j-1)][j-1]) same++; else same = 1; p[i-j][j] = same; } } // vertical asc (rev) for(int j=0; j= 0; --i) { if(i < n-1 && match(map[i][j] - map[i+1][j], X)) { ok = min(ok+1, p[i][j]); } else { ok = 1; } p2[i][j] = ok; TX[i][j] = X; } } // horizontal asc for(int i=0; i 0 && match(map[i][j] - map[i][j-1], X)) { ok = min(ok+1, p[i][j]); } else { ok = 1; } if(TX[i][j] != -X) continue; int t = min(ok, p2[i][j]); best = max(best, t*t); } } } void doh() { // horizontal same for(int i=0; i < n; ++i) { int same; for(int j = 0; j < m; ++j) { if(j>0 && map[i][j] == map[i][j-1]) same++; else same = 1; p[i][j] = same; } } // vertical for(int j=0; j 0 && match(map[i][j] - map[i-1][j], X)) { ok++; dim = min(dim, p[i][j]); } else { ok = 1; dim = p[i][j]; } int t = min(ok, dim); best = max(best, t*t); } } } void dov() { // vertical same for(int j=0; j < m; ++j) { int same; for(int i = 0; i < n; ++i) { if(i>0 && map[i][j] == map[i-1][j]) same++; else same = 1; p[i][j] = same; } } // horizontal for(int i=0; i 0 && match(map[i][j] - map[i][j-1], X)) { ok++; dim = min(dim, p[i][j]); } else { ok = 1; dim = p[i][j]; } int t = min(ok, dim); best = max(best, t*t); } } } int main() { while(cin >> n >> m && n && m) { for(int i=0; i < n; ++i) { for(int j=0; j < m; ++j) scanf("%d", map[i]+j); } best = 0; doh(); dov(); dod(); for(int i = 0; i < n; ++i) { for(int j = 0; j < m/2; ++j) swap(map[i][j], map[i][m-1-j]); } dod(); for(int j = 0; j < m; ++j) { for(int i = 0; i < n/2; ++i) swap(map[i][j], map[n-1-i][j]); } dod(); for(int i = 0; i < n; ++i) { for(int j = 0; j < m/2; ++j) swap(map[i][j], map[i][m-1-j]); } dod(); cout << best << endl; } return 0; }