#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 5;
struct Node {
int mxp = -1, mnp = -1, mxn = 1, mnn = 1;
} s1[N][(int)log2(N) + 5], s2[N][(int)log2(N) + 5];
Node merge(Node a, Node b) {
Node r;
r.mxp = max(a.mxp, b.mxp);
if(a.mnp >= 0 && (r.mnp < 0 || a.mnp < r.mnp)) r.mnp = a.mnp;
if(b.mnp >= 0 && (r.mnp < 0 || b.mnp < r.mnp)) r.mnp = b.mnp;
r.mnn = min(a.mnn, b.mnn);
if(a.mxn < 0 && (r.mxn >= 0 || a.mxn > r.mxn)) r.mxn = a.mxn;
if(b.mxn < 0 && (r.mxn >= 0 || b.mxn > r.mxn)) r.mxn = b.mxn;
return r;
}
void build(int p[], int s, Node t[][(int)log2(N) + 5]) {
for(int i = 1; i <= s; i++)
if(p[i] >= 0) t[i][0].mxp = t[i][0].mnp = p[i];
else t[i][0].mxn = t[i][0].mnn = p[i];
int l = log2(s) + 5;
for(int j = 1; j < l; j++)
for(int i = pow(2, j); i <= s; i++)
t[i][j] = merge(t[i][j - 1], t[i - (int)pow(2, j - 1)][j - 1]);
}
vector<int> get(Node t[][(int)log2(N) + 5], int l, int r) {
vector<int> v;
int k = log2(r - l + 1);
Node c = merge(t[r][k], t[l + (int)pow(2, k) - 1][k]);
if(c.mxp >= 0) {
v.push_back(c.mxp);
v.push_back(c.mnp);
}
if(c.mxn < 0) {
v.push_back(c.mxn);
v.push_back(c.mnn);
}
return v;
}
int n, m, q, a[N], b[N];
signed main() {
cin>>n>>m>>q;
for(int i = 1; i <= n; i++) cin>>a[i];
for(int i = 1; i <= m; i++) cin>>b[i];
build(a, n, s1);
build(b, m, s2);
while(q--) {
int l1, r1, l2, r2;
cin>>l1>>r1>>l2>>r2;
auto v1 = get(s1, l1, r1), v2 = get(s2, l2, r2);
int ans = -1e18;
for(auto i : v1) {
int k = 1e18;
for(auto j : v2) k = min(k, i * j);
ans = max(ans, k);
}
cout<<ans<<endl;
}
return 0;
}