#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=;
int a[maxn][maxn],n,i,t,j,k,l,m,p,x,y,xx,yy,r,mid,l1;
int f[maxn][maxn],g[][][maxn][maxn],ans;
int pan(int x,int y){
int i,j,t=,k=;
while (x+(<<(t+))-<=xx) t++;
while (y+(<<(k+))-<=yy) k++;
ans=g[t][k][xx][yy];
if (g[t][k][x+(<<t)-][y+(<<k)-]>ans) ans=g[t][k][x+(<<t)-][y+(<<k)-];
if (ans<g[t][k][x+(<<t)-][yy]) ans=g[t][k][x+(<<t)-][yy];
if (ans<g[t][k][xx][y+(<<k)-]) ans=g[t][k][xx][y+(<<k)-];
return ans;
}
int get(){
char ch=getchar();int x=;
while (ch<'0' || ch>'9') ch=getchar();
while (ch>='0' && ch<='9') x=x*+ch-'0',ch=getchar();
return x;
}
int main(){
freopen("square.in","r",stdin);freopen("square.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=;i<=n;i++)
for (j=;j<=m;j++){
scanf("%d",&a[i][j]);
if (a[i][j]) f[i][j]=min(min(f[i-][j-],f[i-][j]),f[i][j-])+;
g[][][i][j]=f[i][j];
}
l1=log(n)/log();
p=log(m)/log();
for (i=;i<=l1;i++)
for (j=;j<=p;j++){
if (!i && !j) continue;
for (x=(<<i);x<=n;x++)
for (y=(<<j);y<=m;y++){
if (i){
if (g[i-][j][x][y]>g[i-][j][x-(<<(i-))][y]) g[i][j][x][y]=g[i-][j][x][y];
else g[i][j][x][y]=g[i-][j][x-(<<(i-))][y];
}
else{
if (g[i][j-][x][y]>g[i][j-][x][y-(<<(j-))]) g[i][j][x][y]=g[i][j-][x][y];
else g[i][j][x][y]=g[i][j-][x][y-(<<(j-))];
}
}
}
scanf("%d",&m);
while (m){
scanf("%d%d%d%d",&x,&y,&xx,&yy);
//x=get();y=get();xx=get();yy=get();
l=;r=min(yy-y+,xx-x+);
while (l<r){
mid=(l+r+)/;
if (pan(x+mid-,y+mid-)>=mid) l=mid;
else r=mid-;
}
printf("%d\n",l);
m--;
}
}