#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;

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 k,int a){
//	// h*w-1©ç¦nßé
//	k+=h*w-1;
//	dat[k]=a;
//	// oèÈªçindexðXV
//	while(k>0){
//		k=(k-1)/2;
//		dat[k]=min(dat[k*2+1],dat[k*2+2]);
//	}
//}
//uint query(int qminx,int qminy,int qmaxx,int qmaxy,int sminx,int sminy,int smaxx,int smaxy,int k){
//	// dÈèªªÈ¢
//	if(qmaxy<sminy||smaxy<qminy||qmaxx<sminx||smaxx<qminx)return INF;
//	// ®SÉÜÜêé
//	if(qminx<=sminx&&smaxx<=qmaxx&&qminy<=sminy&&smaxy<=qmaxy)return dat[k];
//	// »ÝxðªµÄ¢é©AyÅªµÄ¢é©Åêí¯
//	uint vl,vr;
//	if(sminy==smaxy){
//		// yðªµI¦Ä¢éê
//		vl=query(qminx,qminy,qmaxx,qmaxy,sminx,sminy,(smaxx+sminx)/2,smaxy,2*k+1);
//		vr=query(qminx,qminy,qmaxx,qmaxy,(smaxx+sminx)/2+1,sminy,smaxx,smaxy,2*k+2);
//	}
//	else{
//		// Ü¾yðªµI¦Ä¢È¢ê,yÅª
//		vl=query(qminx,qminy,qmaxx,qmaxy,sminx,sminy,smaxx,(smaxy+sminy)/2,2*k+1);
//		vr=query(qminx,qminy,qmaxx,qmaxy,sminx,(smaxy+sminy)/2+1,smaxx,smaxy,2*k+2);
//	}
//	//if(vl<vr)return vl;
//	//return vr;
//	return min(vl,vr);
//}
//void update(int k,int a){
//	// h*w-1©ç¦nßé
//	k+=h*w-1;
//	dat[k]=a;
//	// oèÈªçindexðXV
//	while(k>0){
//		k=(k-1)/2;
//		dat[k]=min(dat[k*2+1],dat[k*2+2]);
//	}
//}
void update(int qminx,int qminy,int qmaxx,int qmaxy,int sminx,int sminy,int smaxx,int smaxy,uint a,int k,bool isHor){
	// dÈèªªÈ¢
	if(qmaxy<sminy||smaxy<qminy||qmaxx<sminx||smaxx<qminx)return;
	// ®SÉÜÜêé
	dat[k]=min(dat[k],a);
	if(qminx<=sminx&&smaxx<=qmaxx&&qminy<=sminy&&smaxy<=qmaxy){
		// ¡ñÌêðXVµ½çI¹
		return;
	}
	// ¡ñÇ¿çÅØé©
	bool nxt=!isHor;
	// x©yÌª1ÉÈÁ½çAÐûÌÝ©Ä¢­
	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);
		if(sminy!=smaxy)
			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);
		if(smaxx!=sminx)
			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){
	// dÈèªªÈ¢
	if(qmaxy<sminy||smaxy<qminy||qmaxx<sminx||smaxx<qminx)return INF;
	// ®SÉÜÜêé
	if(qminx<=sminx&&smaxx<=qmaxx&&qminy<=sminy&&smaxy<=qmaxy)return dat[k];
	// »ÝxðªµÄ¢é©AyÅªµÄ¢é©Åêí¯
	uint vl,vr;
	// ¡ñÇ¿çÅØé©
	bool nxt=!isHor;
	// x©yÌª1ÉÈÁ½çAÐûÌÝ©Ä¢­
	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);
}

int main(){
	FILE *fp=stdin;
	//fp=fopen("input.txt","r");
	while(fscanf(fp,"%d %d %d",&r,&c,&q)&&!(r==0&&c==0&&q==0)){
		//while(cin>>r>>c>>q&&!(r==0&&c==0&&q==0)){
		//fast_stream();
		init(r,c);
		for(int i = 0; i < r; i++){
			for(int j = 0; j < c; j++){
				int t;
				//cin>>t;
				fscanf(fp,"%d",&t);
				//pdate(i*w+j,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;
			//cin>>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);
			//cout<<res<<endl;
			printf("%d\n",(int)res);
		}
	}
	return 0;
}

Measured memory_bytes: 0