#include <bits/stdc++.h>
using namespace std;
#define N 100005
long long ans, st[7][N][20];
int n, m, q, l1, l2, r1, r2, a[N], b[N];
void init() {
int t = log(n)/log(2) + 1;
for (int i = 1; i <= n; i++) {
st[1][i][0] = a[i];
st[2][i][0] = a[i];
st[5][i][0] = a[i]>=0?a[i]:0x3f3f3f3f3f3f3f3f;
st[6][i][0] = a[i]<0?a[i]:0xcfcfcfcfcfcfcfcf;
}
for (int j = 1; j <= t; j++) {
for (int i = 1; i <= n-(1<<j)+1; i++) {
st[1][i][j] = max(st[1][i][j-1], st[1][i+(1<<j-1)][j-1]);
st[2][i][j] = min(st[2][i][j-1], st[2][i+(1<<j-1)][j-1]);
st[5][i][j] = min(st[5][i][j-1], st[5][i+(1<<j-1)][j-1]);
st[6][i][j] = max(st[6][i][j-1], st[6][i+(1<<j-1)][j-1]);
}
}
t = log(m)/log(2) + 1;
for (int i = 1; i <= m; i++) {
st[3][i][0] = b[i];
st[4][i][0] = b[i];
}
for (int j = 1; j <= t; j++) {
for (int i = 1; i <= m-(1<<j)+1; i++) {
st[3][i][j] = max(st[3][i][j-1], st[3][i+(1<<j-1)][j-1]);
st[4][i][j] = min(st[4][i][j-1], st[4][i+(1<<j-1)][j-1]);
}
}
}
long long query(int num, int l, int r) {
int k = log(r-l+1)/log(2);
if (num == 1) return max(st[1][l][k], st[1][r-(1<<k)+1][k]);
else if (num == 2) return min(st[2][l][k], st[2][r-(1<<k)+1][k]);
else if (num == 3) return max(st[3][l][k], st[3][r-(1<<k)+1][k]);
else if (num == 4) return min(st[4][l][k], st[4][r-(1<<k)+1][k]);
else if (num == 5) return min(st[5][l][k], st[5][r-(1<<k)+1][k]);
else return max(st[6][l][k], st[6][r-(1<<k)+1][k]);
}
int main() {
scanf("%d%d%d", &n, &m, &q);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
for (int i = 1; i <= m; i++) {
scanf("%d", &b[i]);
}
init();
for (int i = 1; i <= q; i++) {
scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
long long a1 = query(1, l1, r1), a2 = query(2, l1, r1), a3 = query(3, l2, r2), a4 = query(4, l2, r2), a5 = query(5, l1, r1), a6 = query(6, l1, r1);
ans = max(a1*a4, a2*a3);
if (a5 != 0x3f3f3f3f3f3f3f3f) ans = max(a5*a4, ans);
if (a6 != 0xcfcfcfcfcfcfcfcf) ans = max(a6*a3, ans);
printf("%lld\n", ans);
}
return 0;
}