#include<bits/stdc++.h>
#define mid (int)((lt + rt) >> 1)
#define int long long
using namespace std;
const int N = 1e6 + 5, inf = 1e18;
int n, m, q, a[N], b[N];
int valaza[N], valazi[N], valafa[N], valafi[N], valba[N], valbi[N];
//aza
void buildaza(int x, int lt, int rt){
if(lt == rt){
if(a[lt] >= 0) valaza[x] = a[lt];
else valaza[x] = -inf;
return ;
}
buildaza(x * 2, lt, mid);
buildaza(x * 2 + 1, mid + 1, rt);
valaza[x] = max(valaza[x * 2], valaza[x * 2 + 1]);
}
//azi
void buildazi(int x, int lt, int rt){
if(lt == rt){
if(a[lt] >= 0) valazi[x] = a[lt];
else valazi[x] = inf;
return ;
}
buildazi(x * 2, lt, mid);
buildazi(x * 2 + 1, mid + 1, rt);
valazi[x] = min(valazi[x * 2], valazi[x * 2 + 1]);
}
//afa
void buildafa(int x, int lt, int rt){
if(lt == rt){
if(a[lt] < 0) valafa[x] = a[lt];
else valafa[x] = -inf;
return ;
}
buildafa(x * 2, lt, mid);
buildafa(x * 2 + 1, mid + 1, rt);
valafa[x] = max(valafa[x * 2], valafa[x * 2 + 1]);
}
//afi
void buildafi(int x, int lt, int rt){
if(lt == rt){
if(a[lt] < 0) valafi[x] = a[lt];
else valafi[x] = inf;
return ;
}
buildafi(x * 2, lt, mid);
buildafi(x * 2 + 1, mid + 1, rt);
valafi[x] = min(valafi[x * 2], valafi[x * 2 + 1]);
}
//ba
void buildba(int x, int lt, int rt){
if(lt == rt){
valba[x] = b[lt];
return ;
}
buildba(x * 2, lt, mid);
buildba(x * 2 + 1, mid + 1, rt);
valba[x] = max(valba[x * 2], valba[x * 2 + 1]);
}
//bi
void buildbi(int x, int lt, int rt){
if(lt == rt){
valbi[x] = b[lt];
return ;
}
buildbi(x * 2, lt, mid);
buildbi(x * 2 + 1, mid + 1, rt);
valbi[x] = min(valbi[x * 2], valbi[x * 2 + 1]);
}
//aza
int queryaza(int x, int lt, int rt, int ql, int qr){
if(lt > qr || rt < ql) return -inf;
if(lt >= ql && rt <= qr) return valaza[x];
return max(queryaza(x * 2, lt, mid, ql, qr), queryaza(x * 2 + 1, mid + 1, rt, ql, qr));
}
//azi
int queryazi(int x, int lt, int rt, int ql, int qr){
if(lt > qr || rt < ql) return inf;
if(lt >= ql && rt <= qr) return valazi[x];
return min(queryazi(x * 2, lt, mid, ql, qr), queryazi(x * 2 + 1, mid + 1, rt, ql, qr));
}
//afa
int queryafa(int x, int lt, int rt, int ql, int qr){
if(lt > qr || rt < ql) return -inf;
if(lt >= ql && rt <= qr) return valafa[x];
return max(queryafa(x * 2, lt, mid, ql, qr), queryafa(x * 2 + 1, mid + 1, rt, ql, qr));
}
//afi
int queryafi(int x, int lt, int rt, int ql, int qr){
if(lt > qr || rt < ql) return inf;
if(lt >= ql && rt <= qr) return valafi[x];
return min(queryafi(x * 2, lt, mid, ql, qr), queryafi(x * 2 + 1, mid + 1, rt, ql, qr));
}
//ba
int queryba(int x, int lt, int rt, int ql, int qr){
if(lt > qr || rt < ql) return -inf;
if(lt >= ql && rt <= qr) return valba[x];
return max(queryba(x * 2, lt, mid, ql, qr), queryba(x * 2 + 1, mid + 1, rt, ql, qr));
}
//bi
int querybi(int x, int lt, int rt, int ql, int qr){
if(lt > qr || rt < ql) return inf;
if(lt >= ql && rt <= qr) return valbi[x];
return min(querybi(x * 2, lt, mid, ql, qr), querybi(x * 2 + 1, mid + 1, rt, ql, qr));
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin >> n >> m >> q;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= m; i++) cin >> b[i];
buildafa(1, 1, n);
buildaza(1, 1, n);
buildafi(1, 1, n);
buildaza(1, 1, n);
buildba(1, 1, m);
buildbi(1, 1, m);
while(q--){
int la, ra, lb, rb;
cin >> la >> ra >> lb >> rb;
int aza, afa, azi, afi, ba, bi;
aza = queryaza(1, 1, n, la, ra);
afa = queryafa(1, 1, n, la, ra);
azi = queryazi(1, 1, n, la, ra);
afi = queryafi(1, 1, n, la, ra);
ba = queryba(1, 1, m, lb, rb);
bi = querybi(1, 1, m, lb, rb);
int maxi = -inf;
if(aza != -inf) maxi = max(maxi, bi * aza);
if(azi != inf) maxi = max(maxi, bi * azi);
if(afa != -inf) maxi = max(maxi, ba * afa);
if(afi != inf) maxi = max(maxi, ba * afi);
cout << maxi << "\n";
}
return 0;
}