#include <stdio.h>
#include <string.h>
#include <limits.h>

int n, dat[(1 << 21) - 1];
int x1, x2, y1, y2;
int w, h, q;

int _min(int a, int b)
{
    return (b > a ? a : b);
}

void init(int size)
{
    int i;
    n = 1;
    while (n < size){
        n *= 2;
    }
    
    for (i = 0; i < 2 * n - 1; i++){
        dat[i] = INT_MAX;
    }
}

void update(int k, int x)
{
    k += n - 1;
    dat[k] = x;
    while (k > 0){
        k = (k - 1) / 2;
        dat[k] = _min(dat[k * 2 + 1], dat[k * 2 + 2]);
    }
}

int query(int a, int b, int k, int l, int r)
{
    int vl, vr;
    
    if (r <= a || b <= l){
        return (INT_MAX);
    }
    if (a <= l && r <= b && l / w == (r - 1) / w && y1 <= l / w && l / w <= y2 && x1 <= l % w && l % w <= x2 && x1 <= (r - 1) % w && (r - 1) % w <= x2){
        return (dat[k]);
    }
    else if (a <= l && r <= b && l / w == (r - 1) / w){
        return (INT_MAX);
    }
    else {
        vl = query(a, b, k * 2 + 1, l, (l + r) / 2);
        vr = query(a, b, k * 2 + 2, (l + r) / 2, r);
        return (_min(vl, vr));
    }
}

int main(void)
{
    int t;
    int i, j;
    int ans;
    
    while (1){
        scanf("%d%d%d", &h, &w, &q);
        
        if (w + h + q == 0){
            break;
        }
        
        init(w * h);
        for (i = 0; i < h; i++){
            for (j = 0; j < w; j++){
                scanf("%d", &t);
                update(i * w + j, t);
            }
        }
        
        for (j = 0; j < q; j++){
            scanf("%d%d%d%d", &y1, &x1, &y2, &x2);
            printf("%d\n", query(y1 * w + x1, y2 * w + x2 + 1, 0, 0, n));
        }
    }
    
    return (0);
}