#include <cstdio>
#include <iostream>
#include <vector>
#include <list>
#include <cmath>
#include <fstream>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
#include <map>
#include <complex>
#include <iterator>
#include <cstdlib>
#include <cstring>
#include <sstream>

using namespace std;
typedef long long ll;

//#define RED_FILE

#ifdef RED_FILE
ifstream ifs("input.txt");
ofstream ofs("output.txt");
#define cin ifs
#define cout ofs
#endif

typedef unsigned int uint;

const uint INF=(uint)2147483647+(uint)1;
const int MAX_N=1<<20;

// ツ禿アツ篠淞個ウseg treeツづ個デツーツタツづーツ格ツ納
uint dat[8*MAX_N];
int n;
int h,w;
int r,c,q;

void init(int h_,int w_){
	h=w=1;
	while(h<h_)h*=2;
	while(w<w_)w*=2;
	for(int i = 0; i < 8*MAX_N; i++)
		dat[i]=INF;
}
void update(int qminx,int qminy,int qmaxx,int qmaxy,int sminx,int sminy,int smaxx,int smaxy,uint a,int k,bool isHor){
	// ツ重ツづ按づィツ閉板閉ェツつェツづ按つ「
	if(qmaxy<sminy||smaxy<qminy||qmaxx<sminx||smaxx<qminx)return;
	dat[k]=min(dat[k],a);
	// ツ債。ツ嘉アツづ個湘ェツ渉環づーツ更ツ新ツつオツつスツづァツ終ツ猟ケ
	if(qminx<=sminx&&smaxx<=qmaxx&&qminy<=sminy&&smaxy<=qmaxy)
		return;
	// ツ債。ツ嘉アツづつソツづァツづ静伉づゥツつゥ
	bool nxt=!isHor;
	// xツつゥyツづ個閉敖つェ1ツづ可づ按づつスツづァツ、ツ陛青陛サツづ個づ敖個ゥツづつ「ツつュ
	if(sminy==smaxy){
		update(qminx,qminy,qmaxx,qmaxy,sminx,sminy,(smaxx+sminx)/2,smaxy,a,2*k+1,nxt);
		update(qminx,qminy,qmaxx,qmaxy,(smaxx+sminx)/2+1,sminy,smaxx,smaxy,a,2*k+2,nxt);
		return;
	}
	else if(sminx==smaxx){
		update(qminx,qminy,qmaxx,qmaxy,sminx,sminy,smaxx,(smaxy+sminy)/2,a,2*k+1,nxt);
		update(qminx,qminy,qmaxx,qmaxy,sminx,(smaxy+sminy)/2+1,smaxx,smaxy,a,2*k+2,nxt);
		return;
	}
	if(isHor){
		update(qminx,qminy,qmaxx,qmaxy,sminx,sminy,smaxx,(smaxy+sminy)/2,a,2*k+1,nxt);
		update(qminx,qminy,qmaxx,qmaxy,sminx,(smaxy+sminy)/2+1,smaxx,smaxy,a,2*k+2,nxt);
	}
	else{
		update(qminx,qminy,qmaxx,qmaxy,sminx,sminy,(smaxx+sminx)/2,smaxy,a,2*k+1,nxt);
		update(qminx,qminy,qmaxx,qmaxy,(smaxx+sminx)/2+1,sminy,smaxx,smaxy,a,2*k+2,nxt);
	}
}

uint query(int qminx,int qminy,int qmaxx,int qmaxy,int sminx,int sminy,int smaxx,int smaxy,int k,bool isHor){
	// ツ重ツづ按づィツ閉板閉ェツつェツづ按つ「
	if(qmaxy<sminy||smaxy<qminy||qmaxx<sminx||smaxx<qminx)return INF;
	// ツ環ョツ全ツづ可甘慊づ慊づェツづゥ
	if(qminx<=sminx&&smaxx<=qmaxx&&qminy<=sminy&&smaxy<=qmaxy)return dat[k];
	// ツ個サツ催捶ツづーツ閉ェツ環つオツづつ「ツづゥツつゥツ、yツづ閉ェツ環つオツづつ「ツづゥツつゥツづ湘ェツ債づュツつッ
	uint vl,vr;
	// ツ債。ツ嘉アツづつソツづァツづ静伉づゥツつゥ
	bool nxt=!isHor;
	// xツつゥyツづ個閉敖つェ1ツづ可づ按づつスツづァツ、ツ陛青陛サツづ個づ敖個ゥツづつ「ツつュ
	if(sminy==smaxy){
		vl=query(qminx,qminy,qmaxx,qmaxy,sminx,sminy,(smaxx+sminx)/2,smaxy,2*k+1,nxt);
		vr=query(qminx,qminy,qmaxx,qmaxy,(smaxx+sminx)/2+1,sminy,smaxx,smaxy,2*k+2,nxt);
		return min(vl,vr);
	}
	else if(sminx==smaxx){
		vl=query(qminx,qminy,qmaxx,qmaxy,sminx,sminy,smaxx,(smaxy+sminy)/2,2*k+1,nxt);
		vr=query(qminx,qminy,qmaxx,qmaxy,sminx,(smaxy+sminy)/2+1,smaxx,smaxy,2*k+2,nxt);
		return min(vl,vr);
	}
	if(isHor){
		vl=query(qminx,qminy,qmaxx,qmaxy,sminx,sminy,smaxx,(smaxy+sminy)/2,2*k+1,nxt);
		if(sminy!=smaxy)
			vr=query(qminx,qminy,qmaxx,qmaxy,sminx,(smaxy+sminy)/2+1,smaxx,smaxy,2*k+2,nxt);
		else
			vr=INF;
	}
	else{
		vl=query(qminx,qminy,qmaxx,qmaxy,sminx,sminy,(smaxx+sminx)/2,smaxy,2*k+1,nxt);
		if(smaxx!=sminx)
			vr=query(qminx,qminy,qmaxx,qmaxy,(smaxx+sminx)/2+1,sminy,smaxx,smaxy,2*k+2,nxt);
		else vr=INF;
	}
	return min(vl,vr);
}

// school of killifishツづーツ嘉ーツつ「ツつスツコツーツド
void run_test(){
	FILE *fp=stdin;
	//fp=fopen("input.txt","r");
	while(fscanf(fp,"%d %d %d",&r,&c,&q)&&!(r==0&&c==0&&q==0)){
		init(r,c);
		for(int i = 0; i < r; i++){
			for(int j = 0; j < c; j++){
				int t;
				fscanf(fp,"%d",&t);
				update(j,i,j,i,0,0,w-1,h-1,t,0,true);
			}
		}
		for(int i = 0; i < q; i++){
			int r1,c1,r2,c2;
			fscanf(fp,"%d %d %d %d",&r1,&c1,&r2,&c2);
			uint res=query(c1,r1,c2,r2,0,0,w-1,h-1,0,true);
			printf("%d\n",(int)res);
		}
	}
}

int main(){
	run_test();
	return 0;
}

Measured memory_bytes: 0