#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
const long long INF = 1e9 + 19;
const int LOG = 11;
int n, m;
int a[N][N];
int b[N][N];
int pref[N][N];
short table[LOG][LOG][N][N];
int deg[N];
void read() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) scanf("%d", &a[i][j]);
}
int getSum(int x1, int y1, int x2, int y2) {
  return pref[x2][y2] - pref[x1][y2] - pref[x2][y1] + pref[x1][y1];
}
bool isSquare(int x1, int y1, int x2, int y2) {
  return (x2 - x1) * (y2 - y1) == getSum(x1, y1, x2, y2);
}
int getMax(int x1, int y1, int x2, int y2) {
  int szX = x2 - x1;
  int szY = y2 - y1;
  int dx = deg[szX];
  int dy = deg[szY];
  int tmp = max(max(table[dx][dy][x1][y1], table[dx][dy][x2 - (1 << dx)][y1]),
                max(table[dx][dy][x1][y2 - (1 << dy)],
                    table[dx][dy][x2 - (1 << dx)][y2 - (1 << dy)]));
  return tmp;
}
void solve() {
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
      pref[i + 1][j + 1] =
          pref[i + 1][j] + pref[i][j + 1] - pref[i][j] + a[i][j];
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      int l = 0;
      int r = min(n - i, m - j) + 1;
      while (r - l > 1) {
        int mid = (l + r) / 2;
        if (isSquare(i, j, i + mid, j + mid))
          l = mid;
        else
          r = mid;
      }
      b[i][j] = l;
    }
  for (int i = 2; i <= max(n, m); i++) deg[i] = deg[i / 2] + 1;
  for (int dx = 0; dx <= 10; dx++)
    for (int dy = 0; dy <= 10; dy++)
      for (int i = 0; i + (1 << dx) <= n; i++)
        for (int j = 0; j + (1 << dy) <= m; j++) {
          if (dx == 0 && dy == 0) {
            table[0][0][i][j] = b[i][j];
          } else if (dx != 0) {
            table[dx][dy][i][j] =
                max(table[dx - 1][dy][i][j],
                    table[dx - 1][dy][i + (1 << (dx - 1))][j]);
          } else
            table[dx][dy][i][j] =
                max(table[dx][dy - 1][i][j],
                    table[dx][dy - 1][i][j + (1 << (dy - 1))]);
        }
  int t;
  scanf("%d", &t);
  for (int it = 0; it < t; it++) {
    int x1, y1, x2, y2;
    scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
    x1--;
    y1--;
    int l = 0;
    int r = min(x2 - x1, y2 - y1) + 1;
    while (r - l > 1) {
      int mid = (l + r) / 2;
      if (getMax(x1, y1, x2 - mid + 1, y2 - mid + 1) >= mid)
        l = mid;
      else
        r = mid;
    }
    printf("%d\n", l);
  }
}
void stress() {}
int main() {
  if (1) {
    int k = 1;
    for (int tt = 0; tt < k; tt++) {
      read();
      solve();
    }
  } else {
    stress();
  }
  return 0;
}
