#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
#define maxn 305
#define inf 2000000000
vector <pair <int, pair <int,int> > > vm;
vector <pair <pair <int,int> , pair <int,int> > > q;
vector <pair <int,int> > v;
int n;
pair <int,int> dad[maxn][maxn];
pair <int,int> fdad(pair <int,int> p)
{
int l,c;
l=p.first;
c=p.second;
if (dad[l][c]==p)
return p;
dad[l][c]=fdad(dad[l][c]);
return dad[l][c];
}
void showdad()
{
int l,c;
cout<<'\n';
for (l=1;l<=n;l++)
{
for (c=1;c<=n;c++)
cout<<" ("<<(fdad(dad[l][c])).first<<','<<(fdad(dad[l][c])).second<<") ";
cout<<'\n';
}
}
int axl[4] {1,0,0,-1};
int axc[4] {0,1,-1,0};
void step(int which)
{
int ln,cn;
ln=vm[which].second.first;
cn=vm[which].second.second;
dad[ln][cn]=make_pair(ln,cn);
int i;
int lt,ct,ld,cd;
pair <int,int> p;
//cout<<"\nS"<<ln<<' '<<cn<<' ';
for (i=0;i<=3;i++)
{
lt=ln+axl[i];
ct=cn+axc[i];
//cout<<'C'<<lt<<' '<<ct<<"->";
p=fdad(make_pair(lt,ct));
ld=p.first;
cd=p.second;
//cout<<'C'<<ld<<' '<<cd<<' ';
if (make_pair(0,0)!=make_pair(ld,cd))
{
//cout<<"BIND";
dad[ld][cd]=make_pair(ln,cn);
}
//cout<<' ';
}
}
void steps(int &laststep,int target)
{
int i;
for (i=laststep+1;(vm[i].first>=target)&&(i<vm.size());i++)
step(i);
laststep=i-1;
}
bool verify(pair <pair <int,int> , pair <int,int> > p)
{
int l1,c1,l2,c2;
l1=p.first.first;
c1=p.first.second;
l2=p.second.first;
c2=p.second.second;
if ((fdad(make_pair(l1,c1))==fdad(make_pair(l2,c2)))&&(fdad(make_pair(l1,c1))!=make_pair(0,0)))
return true;
return false;
}
void goinit()
{
int l,c;
for (l=0;l<=n+1;l++)
for (c=0;c<=n+1;c++)
dad[l][c].first=dad[l][c].second=0;
}
void go(int nr)
{
goinit();
int laststep,i,now,target;
laststep=0;
vector <pair <int,int> > vmn,vmx;
vector <pair <int,int> > vv;
vmn.clear();vmx.clear();vv.clear();
for (i=0;i<v.size();i++)
{
now=v[i].first;
target=now+nr;
//cout<<target<<'\n';
steps(laststep,target);
if (verify(q[v[i].second]))
vmx.push_back(make_pair(v[i].first+nr,v[i].second));
else
vmn.push_back(v[i]);
//showdad();
}
int imn,imx;
imn=0;
imx=0;
while ((imn<vmn.size())&&(imx<vmx.size()))
{
while ((vmx[imx].first>=vmn[imn].first)&&(imx<vmx.size()))
{
vv.push_back(vmx[imx]);
imx++;
}
while ((vmn[imn].first>=vmx[imx].first)&&(imn<vmn.size()))
{
vv.push_back(vmn[imn]);
imn++;
}
}
for (;imx<vmx.size();imx++)
vv.push_back(vmx[imx]);
for (;imn<vmn.size();imn++)
vv.push_back(vmn[imn]);
v.clear();
v=vv;
}
int nq,l,c,i,l1,c1,l2,c2,bit,ax;
int m[maxn][maxn];
int main(void)
{
FILE * f;
f=fopen("matrice2.in","r");
ofstream g("matrice2.out");
fscanf(f,"%d%d",&n,&nq);
vm.push_back(make_pair(inf,make_pair(0,0)));
for (l=1;l<=n;l++)
for (c=1;c<=n;c++)
{
fscanf(f,"%d",&m[l][c]);
vm.push_back(make_pair(m[l][c],make_pair(l,c)));
}
sort(vm.rbegin(),vm.rend());
q.push_back(make_pair(make_pair(0,0),make_pair(0,0)));
for (i=1;i<=nq;i++)
{
fscanf(f,"%d%d%d%d",&l1,&c1,&l2,&c2);
q.push_back(make_pair(make_pair(l1,c1),make_pair(l2,c2)));
v.push_back(make_pair(0,i));
}
for (bit=20;bit>=0;bit--)
{
//cout<<"\n\n"<<(1<<bit)<<'\n';
go((1<<bit));
//for (i=0;i<v.size();i++)
//cout<<v[i].first<<' '<<v[i].second<<'\n';
}
for (i=0;i<v.size();i++)
{
ax=v[i].first;
v[i].first=v[i].second;
v[i].second=ax;
}
sort(v.begin(),v.end());
for (i=0;i<v.size();i++)
g<<v[i].second<<'\n';
g.close();
return 0;
}