#include <iostream>
#include <algorithm>
#include <string.h>
#include <iomanip>
#include <bitset>
#include <math.h>
#include <string>
#include <vector>
#include <queue>
#include <set>
#include <map>
#define fst first
#define scd second
#define db double
#define ll long long
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define vi vector <int>
#define pii pair <int, int>
#define sz(x) ((int)x.size())
#define ms(f, x) memset(f, x, sizeof(f))
#define L(i, j, k) for (int i=(j); i<=(k); ++i)
#define R(i, j, k) for (int i=(j); i>=(k); --i)
#define ACN(i, H_u) for (int i=H_u; i; i=E[i].nxt)
using namespace std;
template <typename INT> void rd(INT &res) {
res=0; bool f=false; char ch=getchar();
while (ch<'0'||ch>'9') f|=ch=='-', ch=getchar();
while (ch>='0'&&ch<='9') res=(res<<1)+(res<<3)+(ch^48), ch=getchar();
res=(f?-res:res);
}
template <typename INT, typename...Args>
void rd(INT &x, Args &...y) { rd(x), rd(y...); }
const ll INF=0x3f3f3f3f3f3f3f3f;
const int inf=0x3f3f3f3f;
const int maxn=1e5, maxlg=20;
const int N=maxn+10, lgN=maxlg+5;
int n, m, q, a[N], b[N], Min_a0[lgN][N], Min_a1[lgN][N], Max_a0[lgN][N], Max_a1[lgN][N], Min_b[lgN][N], Max_b[lgN][N];
void ckmin(int Min[lgN][N], int i, int j) { Min[i][j]=min(Min[i-1][j], Min[i-1][j+(1<<i-1)]); }
void ckmax(int Max[lgN][N], int i, int j) { Max[i][j]=max(Max[i-1][j], Max[i-1][j+(1<<i-1)]); }
void init() {
ms(Max_b, -0x3f); ms(Min_b, 0x3f); ms(Max_a1, -0x3f); ms(Max_a0, -0x3f); ms(Min_a1, 0x3f); ms(Min_a0, 0x3f);
L(i, 1, n) {
if (a[i]>=0) Max_a1[0][i]=Min_a1[0][i]=a[i];
else Max_a0[0][i]=Min_a0[0][i]=a[i];
}
L(i, 1, m) Max_b[0][i]=Min_b[0][i]=b[i];
L(i, 1, lgN)
for (int j=1; j+(1<<i)-1<=n; ++j)
ckmax(Max_a0, i, j), ckmax(Max_a1, i, j), ckmin(Min_a0, i, j), ckmin(Min_a1, i, j);
L(i, 1, lgN)
for (int j=1; j+(1<<i)-1<=m; ++j)
ckmax(Max_b, i, j), ckmin(Min_b, i, j);
}
int query_min(int Min[lgN][N], int l, int r) {
int s=__lg(r-l+1);
return min(Min[s][l], Min[s][r-(1<<s)+1]);
}
int query_max(int Max[lgN][N], int l, int r) {
int s=__lg(r-l+1);
return max(Max[s][l], Max[s][r-(1<<s)+1]);
}
void update(ll &ans, int lx, int l, int r) {
if (lx==inf||lx==-inf) return ;
ans=max(ans, min((ll)lx*query_min(Min_b, l, r), (ll)lx*query_max(Max_b, l, r)));
}
signed main() {
freopen("P8818.in", "r", stdin);
freopen("P8818.out", "w", stdout);
rd(n, m, q);
L(i, 1, n) rd(a[i]);
L(i, 1, m) rd(b[i]);
init();
while (q--) {
int l1, r1, l2, r2; rd(l1, r1, l2, r2);
ll ans=-INF;
update(ans, query_min(Min_a0, l1, r1), l2, r2);
update(ans, query_min(Min_a1, l1, r1), l2, r2);
update(ans, query_max(Max_a0, l1, r1), l2, r2);
update(ans, query_max(Max_a1, l1, r1), l2, r2);
printf("%lld\n", ans);
}
return 0;
}