#include <iostream>
#include <cstring>
#include <limits.h>
#include <cmath>
using namespace std;
#define int long long
const int MX = 2e5 + 5;
struct block{
int minx = LLONG_MAX, maxx = LLONG_MIN, posx = LLONG_MAX, negx = LLONG_MIN;
int Size;
void cmp(const block t) {
minx = min(minx, t.minx);
maxx = max(maxx, t.maxx);
posx = min(posx, t.posx);
negx = max(negx, t.negx);
}
void cmp(const int t){
minx = min(minx, t);
maxx = max(maxx, t);
if(t >= 0) posx = min(posx, t);
if(t <= 0) negx = max(negx, t);
}
};
int a[MX], b[MX], n, m, q;
block abl[MX / 500], bbl[MX / 500];
int amta, amtb, siza, sizb;
int bela[MX], belb[MX];
block querya(int l, int r){
block ans;
for(int i = (l % siza == 1 ? bela[l] : bela[l] + 1); i <= (r % siza == 0 ? bela[r] : bela[r] - 1); i++) ans.cmp(abl[i]);
if(l % siza != 1) {
int lst = siza * bela[l];
for(int i = l; i <= lst; i++) ans.cmp(a[i]);
}
if(r % siza){
int fst = siza * bela[r] - siza + 1;
for(int i = fst; i <= r; i++) ans.cmp(a[i]);
}
return ans;
}
block queryb(int l, int r){
block ans;
for(int i = (l % sizb == 1 ? belb[l] : belb[l] + 1); i <= (r % sizb == 0 ? belb[r] : belb[r] - 1); i++) ans.cmp(bbl[i]);
if(l % sizb != 1) {
int lst = sizb * belb[l];
for(int i = l; i <= lst; i++) ans.cmp(b[i]);
}
if(r % sizb){
int fst = sizb * belb[r] - sizb + 1;
for(int i = fst; i <= r; i++) ans.cmp(b[i]);
}
return ans;
}
signed main(){
// freopen("game.in", "r", stdin);
// freopen("game.out", "w", stdout);
cin >> n >> m >> q;
for(int i = 1; i <= n; i++)
cin >> a[i];
for(int i = 1; i <= m; i++)
cin >> b[i];
siza = floor(sqrtl(n));
sizb = floor(sqrtl(m));
amta = n / siza + (n % siza ? 1 : 0);
amtb = m / sizb + (m % sizb ? 1 : 0);
for(int i = 1; i <= amta; i++){
abl[i].Size = (i < amta ? siza : n - (amta - 1) * siza);
for(int j = 1; j <= abl[i].Size; j++){
int tmp = (i - 1) * siza + j;
bela[tmp] = i;
abl[i].minx = min(abl[i].minx, a[tmp]);
abl[i].maxx = max(abl[i].maxx, a[tmp]);
if(a[tmp] >= 0) abl[i].posx = min(abl[i].posx, a[tmp]);
if(a[tmp] <= 0) abl[i].negx = max(abl[i].negx, a[tmp]);
}
}
for(int i = 1; i <= amtb; i++){
bbl[i].Size = (i < amtb ? sizb : m - (amtb - 1) * sizb);
for(int j = 1; j <= sizb; j++){
int tmp = (i - 1) * sizb + j;
belb[tmp] = i;
bbl[i].minx = min(bbl[i].minx, b[tmp]);
bbl[i].maxx = max(bbl[i].maxx, b[tmp]);
if(b[tmp] >= 0) bbl[i].posx = min(bbl[i].posx, b[tmp]);
if(b[tmp] <= 0) bbl[i].negx = max(bbl[i].negx, b[tmp]);
}
}
while(q--){
int l1, r1, l2, r2;
cin >> l1 >> r1 >> l2 >> r2;
block ansa = querya(l1, r1);
block ansb = queryb(l2, r2);
if(ansb.maxx <= 0) cout << ansa.minx * ansb.maxx << endl;
else if(ansb.minx >= 0) cout << ansa.maxx * ansb.minx << endl;
else {
int ans1 = ansb.minx * ansa.posx;
int ans2 = ansb.maxx * ansa.negx;
cout << max(ans1, ans2) << endl;
}
}
return 0;
}