#include <bits/stdc++.h>
using namespace std;
vector<int> logr;
vector<vector<vector<vector<int>>>> sparse;
int x4, y4, x2, y2;
int check(int m) {
  int x3 = x4 + m - 1;
  int y3 = y4 + m - 1;
  if (x3 > x2 || y3 > y2) return false;
  int i = logr[x2 - x3];
  int j = logr[y2 - y3];
  int res = max(max(sparse[i][j][x3][y3], sparse[i][j][x2 - (1 << i) + 1][y3]),
                max(sparse[i][j][x3][y2 - (1 << j) + 1],
                    sparse[i][j][x2 - (1 << i) + 1][y2 - (1 << j) + 1]));
  return res >= m;
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, m;
  cin >> n >> m;
  logr.resize(max(n, m) + 1, 0);
  for (int i = 2; i < int(logr.size()); i++) {
    logr[i] = logr[i / 2] + 1;
  }
  vector<vector<int>> b(n + 1, vector<int>(m + 1));
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      cin >> b[i][j];
    }
  }
  vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (b[i][j] == 0) continue;
      dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1;
    }
  }
  sparse.resize(logr[n] + 1,
                vector<vector<vector<int>>>(
                    logr[m] + 1, vector<vector<int>>(n, vector<int>(m, -1e9))));
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      sparse[0][0][i][j] = dp[i + 1][j + 1];
    }
  }
  for (int i = 0; i <= logr[n]; i++) {
    for (int j = 0; j <= logr[m]; j++) {
      if (i == 0 && j == 0) continue;
      for (int x = 0; x <= n - (1 << i); x++) {
        for (int y = 0; y <= m - (1 << j); y++) {
          int e = max(i - 1, 0);
          int g = max(j - 1, 0);
          sparse[i][j][x][y] =
              max(max(sparse[e][g][x][y],
                      sparse[e][g][x + (i == 0 ? 0 : (1 << e))][y]),
                  max(sparse[e][g][x][y + (j == 0 ? 0 : (1 << g))],
                      sparse[e][g][x + (i == 0 ? 0 : (1 << e))]
                            [y + (j == 0 ? 0 : (1 << g))]));
        }
      }
    }
  }
  int t;
  cin >> t;
  while (t--) {
    cin >> x4 >> y4 >> x2 >> y2;
    x4--;
    y4--;
    x2--;
    y2--;
    int L = 0;
    int R = min(x2 - x4, y2 - y4) + 2;
    while (R - L > 1) {
      int m = (R + L) / 2;
      if (check(m))
        L = m;
      else
        R = m;
    }
    cout << L << '\n';
  }
  return 0;
}
