#55330: c++


yp11451267@yphs.tp.edu.tw (705-43鄭丞博)


#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void solve() {
    int m, n;
    while (cin >> m >> n) {
        // 繼續保持 $O(N)$ 的極致省空間滾動陣列
        vector<int> prev_dp(n, 0);
        vector<int> curr_dp(n, 0);
        int max_side = 0;

        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                int val;
                cin >> val; 

                if (val == 1) {
                    if (i == 0 || j == 0) {
                        curr_dp[j] = 1;
                    } else {
                        curr_dp[j] = min({curr_dp[j - 1], prev_dp[j], prev_dp[j - 1]}) + 1;
                    }
                    max_side = max(max_side, curr_dp[j]);
                } else {
                    curr_dp[j] = 0; 
                }
            }
            prev_dp = curr_dp;
        }

        // 關鍵修正:題目要求的是「邊長」,而非面積!
        cout << max_side << "\n";
    }
}

int main() {
    // 極速輸入輸出優化
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    solve();
    
    return 0;
}