class dsu(): n=1 parent_or_size=[-1 for i in range(n)] def __init__(self,N): self.n=N self.parent_or_size=[-1 for i in range(N)] def merge(self,a,b): assert 0<=a0: result2.append(result[i]) return result2 H,W=map(int,input().split()) A=[list(map(int,input().split())) for i in range(H)] C=set() q=[] Q=int(input()) for i in range(Q): a,b,c,d=map(int,input().split()) q.append(((a-1)*W+b-1,(c-1)*W+d-1)) C.add(i) L=[[] for i in range(H*W+1)] for i in range(H): for j in range(W): if iH*W: break for B in L[z]: pos1,pos2=B[:] Z.merge(pos1,pos2) for j in range(Q): p1,p2=q[j][:] if ans[j]==True: continue if Z.same(p1,p2)==True: ans[j]=True D[i].append(j) result=[0]*Q Z=dsu(H*W) ans=[False]*Q for i in range(M+1): for j in range(k): z=i*k+j if z>H*W: break for B in L[z]: pos1,pos2=B[:] Z.merge(pos1,pos2) if len(L[z])>0: for j in D[i]: p1,p2=q[j] if ans[j]==True: continue if Z.same(p1,p2)==True: ans[j]=True result[j]=z for i in range(Q): print(result[i])