#include <bits/stdc++.h>
#define int long long
using namespace std;
const int INF = 8000000000000000000;
int n, m, q, a[100010], b[100010], ans;
struct TREE {
int l, r, mx;
} t1[400010], t2[400010], t3[400010], t4[400010];
TREE t5[400010], t6[400010];
void pushup1(int u) {
t1[u].mx = max(t1[u<<1].mx, t1[u<<1|1].mx);
}
void pushup2(int u) {
t2[u].mx = min(t2[u<<1].mx, t2[u<<1|1].mx);
}
void pushup3(int u) {
t3[u].mx = max(t3[u<<1].mx, t3[u<<1|1].mx);
}
void pushup4(int u) {
t4[u].mx = min(t4[u<<1].mx, t4[u<<1|1].mx);
}
void build1(int u, int l, int r) {
if(l == r) {
if(a[l] < 0)
t2[u] = {l, l, INF}, t3[u] = {l, l, a[l]};
else t2[u] = {l, l, a[l]}, t3[u] = {l, l, -INF};
t1[u] = t4[u] = {l, l, a[l]};
return;
}
t1[u] = t2[u] = t3[u] = t4[u] = {l, r};
int mid = (l+r)>>1;
build1(u<<1, l, mid), build1(u<<1|1, mid+1, r);
pushup1(u), pushup2(u), pushup3(u), pushup4(u);
}
void pushup5(int u) {
t5[u].mx = max(t5[u<<1].mx, t5[u<<1|1].mx);
}
void pushup6(int u) {
t6[u].mx = min(t6[u<<1].mx, t6[u<<1|1].mx);
}
void build2(int u, int l, int r) {
if(l == r) {
t5[u] = t6[u] = {l, l, b[l]};
return;
}
t5[u] = t6[u] = {l, r};
int mid = (l+r)>>1;
build2(u<<1, l, mid), build2(u<<1|1, mid+1, r);
pushup5(u), pushup6(u);
}
int query1(int u, int l, int r) {
if(t1[u].l >= l && t1[u].r <= r) return t1[u].mx;
int mid = (t1[u].l+t1[u].r)>>1, res = -INF;
if(mid >= l) res = max(res, query1(u<<1, l, r));
if(mid < r) res = max(res, query1(u<<1|1, l, r));
return res;
}
int query2(int u, int l, int r) {
if(t2[u].l >= l && t2[u].r <= r) return t2[u].mx;
int mid = (t2[u].l+t2[u].r)>>1, res = INF;
if(mid >= l) res = min(res, query2(u<<1, l, r));
if(mid < r) res = min(res, query2(u<<1|1, l, r));
return res;
}
int query3(int u, int l, int r) {
if(t3[u].l >= l && t3[u].r <= r) return t3[u].mx;
int mid = (t3[u].l+t3[u].r)>>1, res = -INF;
if(mid >= l) res = max(res, query3(u<<1, l, mid));
if(mid < r) res = max(res, query3(u<<1|1, mid+1, r));
return res;
}
int query4(int u, int l, int r) {
if(t4[u].l >= l && t4[u].r <= r) return t4[u].mx;
int mid = (t4[u].l+t4[u].r)>>1, res = INF;
if(mid >= l) res = min(res, query4(u<<1, l, r));
if(mid < r) res = min(res, query4(u<<1|1, l, r));
return res;
}
int query5(int u, int l, int r) {
if(t5[u].l >= l && t5[u].r <= r) return t5[u].mx;
int mid = (t5[u].l+t5[u].r)>>1, res = -INF;
if(mid >= l) res = max(res, query5(u<<1, l, r));
if(mid < r) res = max(res, query5(u<<1|1, l, r));
return res;
}
int query6(int u, int l, int r) {
if(t6[u].l >= l && t6[u].r <= r) return t6[u].mx;
int mid = (t6[u].l+t6[u].r)>>1, res = INF;
if(mid >= l) res = min(res, query6(u<<1, l, r));
if(mid < r) res = min(res, query6(u<<1|1, l, r));
return res;
}
signed main() {
scanf("%lld%lld%lld", &n, &m, &q);
for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
for(int i = 1; i <= m; i++) scanf("%lld", &b[i]);
build1(1, 1, n), build2(1, 1, m);
for(int i = 1; i <= q; i++) {
int l1, l2, r1, r2;
scanf("%lld%lld%lld%lld", &l1, &r1, &l2, &r2);
int x = query5(1, l2, r2), y = query6(1, l2, r2);
ans = -INF;
ans = max(ans, query1(1, l1, r1)*(query1(1, l1, r1) > 0 ? y : x));
if(query2(1, l1, r1) != INF)
ans = max(ans, query2(1, l1, r1)*(query2(1, l1, r1) > 0 ? y : x));
if(query3(1, l1, r1) != -INF)
ans = max(ans, query3(1, l1, r1)*(query3(1, l1, r1) > 0 ? y : x));
ans = max(ans, query4(1, l1, r1)*(query4(1, l1, r1) > 0 ? y : x));
printf("%lld\n", ans);
}
return 0;
}