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

#define INF (2000000000);

int n, dat[(1 << 21) - 1];

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] = INF;
    }
}

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 INF;
    }
    
    if (a <= l && r <= b){
        return (dat[k]);
    }
    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 r, c, q;
    int t;
    int i, j;
    int x1, x2, y1, y2, y;
    int ans;
    
    while (1){
        scanf("%d%d%d", &r, &c, &q);
        
        if (r + c + q == 0){
            break;
        }
        
        init(r * c);
        
        for (i = 0; i < r; i++){
            for (j = 0; j < c; j++){
                scanf("%d", &t);
                update(i * r + j, t);
            }
        }
        
        for (j = 0; j < q; j++){
            scanf("%d%d%d%d", &y1, &x1, &y2, &x2);
            ans = INF;
            for (y = y1; y <= y2; y++){
                ans = min(ans, query(y * r + x1, y * r + x2 + 1, 0, 0, n));
            }
            printf("%d\n", ans);
        }
    }
    
    return (0);
}