ll n, m, x; int mo[6] = {1, 0, -1, 0, 1}; voidsolve(){ cin >> n >> m; vector<vector<int>>dis(n+2, vector<int>(m+2, INF)); queue<array<int, 2>>q; for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ cin >> x; if(x==1){ dis[i][j] = 0; q.push({i, j}); } } }
while(!q.empty()){ auto it = q.front(); q.pop(); int x = it[0], y = it[1]; for(int i = 0; i < 4; i++){ int xx = x + mo[i]; int yy = y + mo[i+1]; if(xx<1||xx>n||yy<1||yy>m)continue; if(dis[xx][yy] > dis[x][y] + 1){ dis[xx][yy] = dis[x][y] + 1; q.push({xx, yy}); } } }
auto check =[&](int d) -> bool{ int lx = -INF, rx = INF, ly = -INF, ry = INF; for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ if(dis[i][j] > d){ lx = max(lx, i + j - d); rx = min(rx, i + j + d); ly = max(ly, i - j - d); ry = min(ry, i - j + d); } } } for(int i = 1; i <= n; i++){ for(int j = 1; j <= m; j++){ if(i + j >= lx && i + j <= rx && i - j >= ly && i - j <= ry)returntrue; } } returnfalse; };
ll l = 0, r = INF; while(l <= r){ ll mid = l + (r - l) / 2; if(check(mid))r = mid - 1; else l = mid + 1; } cout << l << '\n'; }