#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define MAX 250250
#define pb push_back
#define LOG 22
#define inf 1000000000
struct node
{
int u;
int v;
int val;
node(int _u, int _v, int _val)
{
u = _u;
v = _v;
val = _val;
}
bool operator > (const node& other) const{
return this->val > other.val;
}
};
int n,q, root;
int a[MAX], parent[MAX], w[MAX], head[MAX], pos[MAX], treesize[MAX], depth[MAX], nodee[MAX];
int cnt = 0;
vector<node> canh;
vector<int> adj[MAX];
int f[MAX][22];
inline int get(int i, int j)
{
return (i-1)*n + j;
}
void nhap()
{
canh.reserve(MAX);
cin >> n >> q;
for(int i = 1; i<=n; i++){
for(int j = 1; j<=n; j++) cin >> a[get(i,j)];
}
for(int i = 1; i<=n; i++){
for(int j = 1; j<=n; j++){
if(i + 1 <=n) canh.pb(node(get(i,j), get(i+1,j), min(a[get(i+1, j)], a[get(i,j)])));
if(j + 1 <=n) canh.pb(node(get(i,j), get(i,j+1), min(a[get(i, j+1)], a[get(i,j)])));
}
}
sort(canh.begin(), canh.end(), greater<node>());
}
int findd(int u)
{
if(u == parent[u]) return u;
return parent[u] = findd(parent[u]);
}
bool unionn(int u, int v)
{
u = findd(u);
v = findd(v);
if(u == v) return false;
if(treesize[u] > treesize[v]){
parent[v] = u;
}else{
parent[u] = v;
}
return true;
}
void make_tree()
{
for(int i = 1; i<=n; i++){
for(int j = 1; j<=n; j++){ parent[get(i,j)] = get(i,j); treesize[get(i,j)] = 1;}
}
int m = canh.size();
for(int i = 0; i<m; i++){
int _u = canh[i].u;
int _v = canh[i].v;
if(unionn(_u, _v)){
adj[_u].pb(_v);
adj[_v].pb(_u);
w[_u] = a[_u];
w[_v] = a[_v];
root = _u;
}
}
depth[root] = 0;
parent[root] = 0;
}
void dfs(int v, int par)
{
treesize[v] = 1;
int index = -1;
int ans_index = -1;
for(int u : adj[v]){
++index;
if(u == par) continue;
parent[u] = v;
depth[u] = depth[v] + 1;
dfs(u,v);
treesize[v] += treesize[u];
if(ans_index == -1 || treesize[u] > treesize[adj[v][ans_index]]) ans_index = index;
}
if(ans_index != 0 && ans_index != -1) swap(adj[v][0], adj[v][ans_index]);
}
void decompose(int v, int par, int h)
{
head[v] = h;
pos[v] = ++cnt;
nodee[cnt] = v;
for(int u : adj[v]){
if(u == par) continue;
if(u == adj[v][0]){
decompose(u,v,h);
}else{
decompose(u,v,u);
}
}
}
int gett(int l, int r)
{
int k = 31 - __builtin_clz(r-l+1);
return min(f[l][k], f[r - (1<<k) + 1][k]);
}
void process()
{
vector<int> a(MAX+1);
for(int i = 1; i<=cnt; i++) a[i] = w[nodee[i]];
for(int i = 1; i<= cnt; i++) f[i][0] = a[i];
for(int j = 1; (1<<j) <= cnt; j++){
for(int i = 1; i + (1<<j) - 1 <= cnt; i++) f[i][j] = min(f[i][j-1], f[i + (1<<(j-1))][j-1]);
}
while(q--)
{
int x,y,z,t; cin >> x >> y >> z >> t;
int u = get(x,y);
int v = get(z,t);
int ans = inf;
while(head[u] != head[v]){
if(depth[head[u]] < depth[head[v]]) swap(u,v);
ans = min(ans, gett(pos[head[u]], pos[u]));
u = parent[head[u]];
}
if(depth[u] > depth[v]) swap(u,v);
ans = min(ans, gett(pos[u], pos[v]));
cout << ans << '\n';
}
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
nhap();
make_tree();
dfs(root,-1);
decompose(root, -1, root);
process();
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBNQVggMjUwMjUwCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgTE9HIDIyCiNkZWZpbmUgaW5mIDEwMDAwMDAwMDAKCnN0cnVjdCBub2RlCnsKICAgIGludCB1OwogICAgaW50IHY7CiAgICBpbnQgdmFsOwogICAgbm9kZShpbnQgX3UsIGludCBfdiwgaW50IF92YWwpCiAgICB7CiAgICAgICAgdSA9IF91OwogICAgICAgIHYgPSBfdjsKICAgICAgICB2YWwgPSBfdmFsOwogICAgfQoKICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3Qgbm9kZSYgb3RoZXIpIGNvbnN0ewogICAgICAgIHJldHVybiB0aGlzLT52YWwgPiBvdGhlci52YWw7CiAgICB9Cn07CgppbnQgbixxLCByb290OwppbnQgYVtNQVhdLCBwYXJlbnRbTUFYXSwgd1tNQVhdLCBoZWFkW01BWF0sIHBvc1tNQVhdLCB0cmVlc2l6ZVtNQVhdLCBkZXB0aFtNQVhdLCBub2RlZVtNQVhdOwppbnQgY250ID0gMDsKdmVjdG9yPG5vZGU+IGNhbmg7CnZlY3RvcjxpbnQ+IGFkaltNQVhdOwoKaW50IGZbTUFYXVsyMl07CgppbmxpbmUgaW50IGdldChpbnQgaSwgaW50IGopCnsKICAgIHJldHVybiAoaS0xKSpuICsgajsKfQoKdm9pZCBuaGFwKCkKewogICAgY2FuaC5yZXNlcnZlKE1BWCk7CiAgICBjaW4gPj4gbiA+PiBxOwogICAgZm9yKGludCBpID0gMTsgaTw9bjsgaSsrKXsKICAgICAgICBmb3IoaW50IGogPSAxOyBqPD1uOyBqKyspIGNpbiA+PiBhW2dldChpLGopXTsKICAgIH0KICAgIGZvcihpbnQgaSA9IDE7IGk8PW47IGkrKyl7CiAgICAgICAgZm9yKGludCBqID0gMTsgajw9bjsgaisrKXsKICAgICAgICAgICAgaWYoaSArIDEgPD1uKSBjYW5oLnBiKG5vZGUoZ2V0KGksaiksIGdldChpKzEsaiksIG1pbihhW2dldChpKzEsIGopXSwgYVtnZXQoaSxqKV0pKSk7CiAgICAgICAgICAgIGlmKGogKyAxIDw9bikgY2FuaC5wYihub2RlKGdldChpLGopLCBnZXQoaSxqKzEpLCBtaW4oYVtnZXQoaSwgaisxKV0sIGFbZ2V0KGksaildKSkpOwogICAgICAgIH0KICAgIH0KICAgIHNvcnQoY2FuaC5iZWdpbigpLCBjYW5oLmVuZCgpLCBncmVhdGVyPG5vZGU+KCkpOwp9CgppbnQgZmluZGQoaW50IHUpCnsKICAgIGlmKHUgPT0gcGFyZW50W3VdKSByZXR1cm4gdTsKICAgIHJldHVybiBwYXJlbnRbdV0gPSBmaW5kZChwYXJlbnRbdV0pOwp9Cgpib29sIHVuaW9ubihpbnQgdSwgaW50IHYpCnsKICAgIHUgPSBmaW5kZCh1KTsKICAgIHYgPSBmaW5kZCh2KTsKICAgIGlmKHUgPT0gdikgcmV0dXJuIGZhbHNlOwogICAgaWYodHJlZXNpemVbdV0gPiB0cmVlc2l6ZVt2XSl7CiAgICAgICAgcGFyZW50W3ZdID0gdTsKICAgIH1lbHNlewogICAgICAgIHBhcmVudFt1XSA9IHY7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKfQoKdm9pZCBtYWtlX3RyZWUoKQp7CiAgICBmb3IoaW50IGkgPSAxOyBpPD1uOyBpKyspewogICAgICAgIGZvcihpbnQgaiA9IDE7IGo8PW47IGorKyl7IHBhcmVudFtnZXQoaSxqKV0gPSBnZXQoaSxqKTsgdHJlZXNpemVbZ2V0KGksaildID0gMTt9CiAgICB9CiAgICBpbnQgbSA9IGNhbmguc2l6ZSgpOwogICAgZm9yKGludCBpID0gMDsgaTxtOyBpKyspewogICAgICAgIGludCBfdSA9IGNhbmhbaV0udTsKICAgICAgICBpbnQgX3YgPSBjYW5oW2ldLnY7CiAgICAgICAgaWYodW5pb25uKF91LCBfdikpewogICAgICAgICAgICBhZGpbX3VdLnBiKF92KTsKICAgICAgICAgICAgYWRqW192XS5wYihfdSk7CiAgICAgICAgICAgIHdbX3VdID0gYVtfdV07CiAgICAgICAgICAgIHdbX3ZdID0gYVtfdl07CiAgICAgICAgICAgIHJvb3QgPSBfdTsKICAgICAgICB9CiAgICB9CiAgICBkZXB0aFtyb290XSA9IDA7CiAgICBwYXJlbnRbcm9vdF0gPSAwOwp9Cgp2b2lkIGRmcyhpbnQgdiwgaW50IHBhcikKewogICAgdHJlZXNpemVbdl0gPSAxOwogICAgaW50IGluZGV4ID0gLTE7CiAgICBpbnQgYW5zX2luZGV4ID0gLTE7CiAgICBmb3IoaW50IHUgOiBhZGpbdl0pewogICAgICAgICsraW5kZXg7CiAgICAgICAgaWYodSA9PSBwYXIpIGNvbnRpbnVlOwogICAgICAgIHBhcmVudFt1XSA9IHY7CiAgICAgICAgZGVwdGhbdV0gPSBkZXB0aFt2XSArIDE7CiAgICAgICAgZGZzKHUsdik7CiAgICAgICAgdHJlZXNpemVbdl0gKz0gdHJlZXNpemVbdV07CiAgICAgICAgaWYoYW5zX2luZGV4ID09IC0xIHx8IHRyZWVzaXplW3VdID4gdHJlZXNpemVbYWRqW3ZdW2Fuc19pbmRleF1dKSBhbnNfaW5kZXggPSBpbmRleDsKICAgIH0KICAgIGlmKGFuc19pbmRleCAhPSAwICYmIGFuc19pbmRleCAhPSAtMSkgc3dhcChhZGpbdl1bMF0sIGFkalt2XVthbnNfaW5kZXhdKTsKfQoKdm9pZCBkZWNvbXBvc2UoaW50IHYsIGludCBwYXIsIGludCBoKQp7CiAgICBoZWFkW3ZdID0gaDsKICAgIHBvc1t2XSA9ICsrY250OwogICAgbm9kZWVbY250XSA9IHY7CiAgICBmb3IoaW50IHUgOiBhZGpbdl0pewogICAgICAgIGlmKHUgPT0gcGFyKSBjb250aW51ZTsKICAgICAgICBpZih1ID09IGFkalt2XVswXSl7CiAgICAgICAgICAgIGRlY29tcG9zZSh1LHYsaCk7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGRlY29tcG9zZSh1LHYsdSk7CiAgICAgICAgfQogICAgfQp9CgppbnQgZ2V0dChpbnQgbCwgaW50IHIpCnsKICAgIGludCBrID0gMzEgLSBfX2J1aWx0aW5fY2x6KHItbCsxKTsKICAgIHJldHVybiBtaW4oZltsXVtrXSwgZltyIC0gKDE8PGspICsgMV1ba10pOwp9Cgp2b2lkIHByb2Nlc3MoKQp7CiAgICB2ZWN0b3I8aW50PiBhKE1BWCsxKTsKICAgIGZvcihpbnQgaSA9IDE7IGk8PWNudDsgaSsrKSBhW2ldID0gd1tub2RlZVtpXV07CiAgICBmb3IoaW50IGkgPSAxOyBpPD0gY250OyBpKyspIGZbaV1bMF0gPSBhW2ldOwogICAgZm9yKGludCBqID0gMTsgKDE8PGopIDw9IGNudDsgaisrKXsKICAgICAgICBmb3IoaW50IGkgPSAxOyBpICsgKDE8PGopIC0gMSA8PSBjbnQ7IGkrKykgZltpXVtqXSA9IG1pbihmW2ldW2otMV0sIGZbaSArICgxPDwoai0xKSldW2otMV0pOwogICAgfQogICAgd2hpbGUocS0tKQogICAgewogICAgICAgIGludCB4LHkseix0OyBjaW4gPj4geCA+PiB5ID4+IHogPj4gdDsKICAgICAgICBpbnQgdSA9IGdldCh4LHkpOwogICAgICAgIGludCB2ID0gZ2V0KHosdCk7CiAgICAgICAgaW50IGFucyA9IGluZjsKICAgICAgICB3aGlsZShoZWFkW3VdICE9IGhlYWRbdl0pewogICAgICAgICAgICBpZihkZXB0aFtoZWFkW3VdXSA8IGRlcHRoW2hlYWRbdl1dKSBzd2FwKHUsdik7CiAgICAgICAgICAgIGFucyA9IG1pbihhbnMsIGdldHQocG9zW2hlYWRbdV1dLCBwb3NbdV0pKTsKICAgICAgICAgICAgdSA9IHBhcmVudFtoZWFkW3VdXTsKICAgICAgICB9CiAgICAgICAgaWYoZGVwdGhbdV0gPiBkZXB0aFt2XSkgc3dhcCh1LHYpOwogICAgICAgIGFucyA9IG1pbihhbnMsIGdldHQocG9zW3VdLCBwb3Nbdl0pKTsKICAgICAgICBjb3V0IDw8IGFucyA8PCAnXG4nOwogICAgfQp9CgppbnQgbWFpbigpCnsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7CiAgICBuaGFwKCk7CiAgICBtYWtlX3RyZWUoKTsKICAgIGRmcyhyb290LC0xKTsKICAgIGRlY29tcG9zZShyb290LCAtMSwgcm9vdCk7CiAgICBwcm9jZXNzKCk7CiAgICByZXR1cm4gMDsKfQo=