#include<bits/stdc++.h>
using namespace std;
const int nMax = 100005, mMax = 100005;
int n, m, q, l1, r1, l2, r2;
int a[nMax], b[mMax], la[5], lb[5];
long long ans;
long long pre[5];
struct Node{
int l, r, mx, mn, pmn, nmx;
}t1[4*nMax], t2[4*mMax];
void pushUp1(int cur){
if(t1[cur].l == t1[cur].r){
return ;
}
t1[cur].mx = max(t1[cur<<1].mx, t1[(cur<<1) + 1].mx);
t1[cur].mn = min(t1[cur<<1].mn, t1[(cur<<1) + 1].mn);
t1[cur].pmn = min(t1[cur<<1].pmn, t1[(cur<<1) + 1].pmn);
t1[cur].nmx = max(t1[cur<<1].nmx, t1[(cur<<1) + 1].nmx);
return ;
}
void build1(int L, int R, int cur){
t1[cur].l = L, t1[cur].r = R;
if(L == R){
t1[cur].mx = a[L];
t1[cur].mn = a[L];
t1[cur].pmn = (a[L] >= 0)? a[L] : INT_MAX;
t1[cur].nmx = (a[L] < 0)? a[L] : INT_MIN;
return ;
}
build1(L, (L + R)>>1, cur<<1);
build1(((L + R)>>1) + 1, R, (cur<<1) + 1);
pushUp1(cur);
return ;
}
int query1(int L, int R, int cur, int opt){ // 1-mx, 2-mn, 3-pmn, 4-nmx.
if(t1[cur].r < L || t1[cur].l > R){
if(opt == 1) return INT_MIN;
else if(opt == 2) return INT_MAX;
else if(opt == 3) return INT_MAX;
else return INT_MIN;
}
if(t1[cur].l >= L && t1[cur].r <= R){
if(opt == 1) return t1[cur].mx;
else if(opt == 2) return t1[cur].mn;
else if(opt == 3) return t1[cur].pmn;
else return t1[cur].nmx;
}
int tmp1 = query1(L, R, cur<<1, opt), tmp2 = query1(L, R, (cur<<1) + 1, opt);
if(opt == 1) return max(tmp1, tmp2);
else if(opt == 2) return min(tmp1, tmp2);
else if(opt == 3) return min(tmp1, tmp2);
else return max(tmp1, tmp2);
}
void pushUp2(int cur){
if(t2[cur].l == t2[cur].r){
return ;
}
t2[cur].mx = max(t2[cur<<1].mx, t2[(cur<<1) + 1].mx);
t2[cur].mn = min(t2[cur<<1].mn, t2[(cur<<1) + 1].mn);
return ;
}
void build2(int L, int R, int cur){
t2[cur].l = L, t2[cur].r = R;
if(L == R){
t2[cur].mx = b[L];
t2[cur].mn = b[L];
return ;
}
build2(L, (L + R)>>1, cur<<1);
build2(((L + R)>>1) + 1, R, (cur<<1) + 1);
pushUp2(cur);
return ;
}
int query2(int L, int R, int cur, int opt){ // 1-mx, 2-mn, 3-pmn, 4-nmx.
if(t2[cur].r < L || t2[cur].l > R){
if(opt == 1) return INT_MIN;
else return INT_MAX;
}
if(t2[cur].l >= L && t2[cur].r <= R){
if(opt == 1) return t2[cur].mx;
else return t2[cur].mn;
}
int tmp1 = query2(L, R, cur<<1, opt), tmp2 = query2(L, R, (cur<<1) + 1, opt);
if(opt == 1) return max(tmp1, tmp2);
else return min(tmp1, tmp2);
}
int 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(1, n, 1);
build2(1, m, 1);
while(q--){ // 1-mx, 2-mn, 3-pmn, 4-nmx.
cin >> l1 >> r1 >> l2 >> r2;
for(int i = 1; i <= 4; i++){
la[i] = query1(l1, r1, 1, i);
}
for(int i = 1; i <= 2; i++){
lb[i] = query2(l2, r2, 1, i);
}
ans = LONG_LONG_MIN;
for(int i = 1; i <= 4; i++){
pre[i] = LONG_LONG_MIN;
if(la[i] >= 0){
pre[i] = la[i]*lb[2];
}else{
pre[i] = la[i]*lb[1];
}
ans = max(ans, pre[i]);
}
printf("%lld\n", ans); // .
}
return 0;
}