#include <bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 1e18 + 5;
int n, m, q, a[100010], b[100010], st1[100010][70], st2[100010][70], st3[100010][70], st4[100010][70], st5[100010][70], st6[100010][70];
void build1() {
for (int i = 1; i <= n; i++) st1[i][0] = a[i];
for (int j = 1; (1 << j) <= n; j++)
for (int i = 1; i + (1 << j) - 1 <= n; i++)
st1[i][j] = max(st1[i][j - 1], st1[i + (1 << j - 1)][j - 1]);
}
void build2() {
for (int i = 1; i <= m; i++) st2[i][0] = b[i];
for (int j = 1; (1 << j) <= m; j++)
for (int i = 1; i + (1 << j) - 1 <= m; i++)
st2[i][j] = max(st2[i][j - 1], st2[i + (1 << j - 1)][j - 1]);
}
void build3() {
for (int i = 1; i <= n; i++) st3[i][0] = a[i];
for (int j = 1; (1 << j) <= n; j++)
for (int i = 1; i + (1 << j) - 1 <= n; i++)
st3[i][j] = min(st3[i][j - 1], st3[i + (1 << j - 1)][j - 1]);
}
void build4() {
for (int i = 1; i <= m; i++) st4[i][0] = b[i];
for (int j = 1; (1 << j) <= m; j++)
for (int i = 1; i + (1 << j) - 1 <= m; i++)
st4[i][j] = min(st4[i][j - 1], st4[i + (1 << j - 1)][j - 1]);
}
void build5() {
for (int i = 1; i <= n; i++) if (a[i] >= 0) st5[i][0] = a[i]; else st5[i][0] = INF;
for (int j = 1; (1 << j) <= n; j++)
for (int i = 1; i + (1 << j) - 1 <= n; i++)
st5[i][j] = min(st5[i][j - 1], st5[i + (1 << j - 1)][j - 1]);
}
void build6() {
for (int i = 1; i <= n; i++) if (a[i] < 0) st6[i][0] = a[i]; else st6[i][0] = -INF;
for (int j = 1; (1 << j) <= n; j++)
for (int i = 1; i + (1 << j) - 1 <= n; i++)
st6[i][j] = max(st6[i][j - 1], st6[i + (1 << j - 1)][j - 1]);
}
int query1(int l, int r) {
int k = log2(r - l + 1);
return max(st1[l][k], st1[r - (1 << k) + 1][k]);
}
int query2(int l, int r) {
int k = log2(r - l + 1);
return max(st2[l][k], st2[r - (1 << k) + 1][k]);
}
int query3(int l, int r) {
int k = log2(r - l + 1);
return min(st3[l][k], st3[r - (1 << k) + 1][k]);
}
int query4(int l, int r) {
int k = log2(r - l + 1);
return min(st4[l][k], st4[r - (1 << k) + 1][k]);
}
int query5(int l, int r) {
int k = log2(r - l + 1);
return min(st5[l][k], st5[r - (1 << k) + 1][k]);
}
int query6(int l, int r) {
int k = log2(r - l + 1);
return max(st6[l][k], st6[r - (1 << k) + 1][k]);
}
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];
build1();
build2();
build3();
build4();
build5();
build6();
for (int i = 1; i <= q; i++) {
int l1, r1, l2, r2;
cin >> l1 >> r1 >> l2 >> r2;
int ans1, ans2;
int t2 = query2(l2, r2), t4 = query4(l2, r2), t3 = query3(l1, r1), t6 = query6(l1, r1), t5 = query5(l1, r1), t1 = query1(l1, r1);
if (t2 < 0) ans1 = t2 * t3;
else if (t6 != -INF) ans1 = t2 * t6;
else ans1 = -INF;
if (t4 >= 0) ans2 = t4 * t1;
else if (t5 != INF) ans2 = t4 * t5;
else ans2 = INF;
cout << max(ans1, ans2) << endl;
}
return 0;
}