#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10, M = 8e5 + 10, K = 1e9 + 10;
int n, m, qr;
ll tmp[8], rc[4];
ll a[N*2];
struct res{
int a, b, c, d, e;
};
int f[M][5];
void update(int p){
f[p][0] = max(f[p<<1][0], f[p<<1|1][0]);
f[p][1] = min(f[p<<1][1], f[p<<1|1][1]);
f[p][2] = max(f[p<<1][2], f[p<<1|1][2]);
f[p][3] = min(f[p<<1][3], f[p<<1|1][3]);
f[p][4] = f[p<<1][4] | f[p<<1|1][4];
}
void build(int p, int l, int r){
if(l == r){
if(a[l] > 0){
f[p][0] = a[l];
f[p][1] = a[l] - K;
} else if(a[l] < 0){
f[p][2] = - a[l];
f[p][3] = - a[l] - K;
} else {
f[p][4] = 1;
}
} else {
int mid = l + r >> 1;
build(p<<1, l, mid);
build(p<<1|1, mid+1, r);
update(p);
}
}
res query(int p, int l, int r, int ql, int qr){
if(l > qr || r < ql){
return (res){ 0, 0, 0, 0, 0 };
}
if(ql <= l && r <= qr){
return (res){ f[p][0], f[p][1], f[p][2], f[p][3], f[p][4] };
}
int mid = l + r >> 1;
res x = query(p<<1, l, mid, ql, qr);
res y = query(p<<1|1, mid+1, r, ql, qr);
res ans;
ans.a = max(x.a, y.a);
ans.b = min(x.b, y.b);
ans.c = max(x.c, y.c);
ans.d = min(x.d, y.d);
ans.e = x.e | y.e;
return ans;
}
int main(){
scanf("%d", &n);
scanf("%d", &m);
scanf("%d", &qr);
for(int i = 1; i <= n + m; ++ i){
scanf("%lld", &a[i]);
}
build(1, 1, n+m);
for(int i = 1; i <= qr; ++ i){
int l1, r1, l2, r2;
scanf("%d", &l1);
scanf("%d", &r1);
scanf("%d", &l2);
scanf("%d", &r2);
l2 += n, r2 += n;
res xx = query(1, 1, n+m, l1, r1);
res yy = query(1, 1, n+m, l2, r2);
ll ans = -2e18;
if(xx.e){
ans = 0;
}
tmp[0] = xx.a;
tmp[1] = xx.b + K;
tmp[2] = - xx.c;
tmp[3] = - xx.d - K;
tmp[4] = yy.a;
tmp[5] = yy.b + K;
tmp[6] = - yy.c;
tmp[7] = - yy.d - K;
if(tmp[1] == K){
tmp[1] = 0;
}
if(tmp[3] == -K){
tmp[3] = 0;
}
if(tmp[5] == K){
tmp[5] = 0;
}
if(tmp[7] == -K){
tmp[7] = 0;
}
for(int p = 0; p < 4; ++ p){
int top = 0;
for(int q = 4; q < 8; ++ q){
if(tmp[p] && tmp[q]){
rc[++top] = tmp[p] * tmp[q];
}
}
sort(rc + 1, rc + top + 1);
if(top){
ans = max(ans, rc[1]);
}
}
printf("%lld\n", ((ans > 0) && yy.e) ? 0 : ans);
}
return 0;
}