#include<bits/stdc++.h>
#define SZ 10005
#define INF 1e9+7
#define ll long long
#define pr pair<pair<ll,ll>,pair<ll,ll>>
#define mp(x,y,z,c) make_pair(make_pair(x,y),make_pair(z,c))
using namespace std;
int n,m,q;
ll A[SZ],B[SZ];
struct SegmentTree{
int l,r;
ll ma,mi,fma,fmi;
}trA[5*SZ],trB[5*SZ];
void pushup(int u,SegmentTree tr[]){
tr[u].ma=max(tr[u<<1].ma,tr[u<<1|1].ma);
tr[u].mi=min(tr[u<<1].mi,tr[u<<1|1].mi);
tr[u].fma=max(tr[u<<1].fma,tr[u<<1|1].fma);
tr[u].fmi=min(tr[u<<1].fmi,tr[u<<1|1].fmi);
return;
}
void Build(int u,int l,int r,SegmentTree tr[],ll num[]){
tr[u].l=l;tr[u].r=r;
if(l==r){
tr[u].ma=tr[u].mi=num[l];
if(num[l]>=0){
tr[u].fmi=num[l];tr[u].fma=-INF;
}else{
tr[u].fma=num[l];tr[u].fmi=INF;
}
return;
}
int mid=(l+r)>>1;
Build(u<<1,l,mid,tr,num);
Build(u<<1|1,mid+1,r,tr,num);
pushup(u,tr);
return;
}
pr Ask(int u,int l,int r,SegmentTree tr[]){
if(l<=tr[u].l&&tr[u].r<=r){
return mp(tr[u].ma,tr[u].mi,tr[u].fma,tr[u].fmi);
}
int mid=(tr[u].l+tr[u].r)>>1;
ll U1=-INF,U2=INF,U3=-INF,U4=INF;pr V;
if(l<=mid){
V=Ask(u<<1,l,r,tr);
U1=max(U1,V.first.first);
U2=min(U2,V.first.second);
U3=max(U3,V.second.first);
U4=min(U4,V.second.second);
}
if(r>mid){
V=Ask(u<<1|1,l,r,tr);
U1=max(U1,V.first.first);
U2=min(U2,V.first.second);
U3=max(U3,V.second.first);
U4=min(U4,V.second.second);
}
pushup(u,tr);
return mp(U1,U2,U3,U4);
}
signed main(){
cin>>n>>m>>q;
for(int i=1;i<=n;i++){cin>>A[i];}Build(1,1,n,trA,A);
for(int i=1;i<=m;i++){cin>>B[i];}Build(1,1,n,trB,B);
for(int i=1,l1,r1,l2,r2;i<=q;i++){
cin>>l1>>r1>>l2>>r2;
pr Na=Ask(1,l1,r1,trA),Nb=Ask(1,l2,r2,trB);
ll tmp=-1e18;
tmp=max(tmp,Na.first.first*(Na.first.first>=0?Nb.first.second:Nb.first.first));
tmp=max(tmp,Na.first.second*(Na.first.second>=0?Nb.first.second:Nb.first.first));
tmp=max(tmp,Na.second.first*Nb.first.first);
tmp=max(tmp,Na.second.second*Nb.first.second);
cout<<tmp<<endl;
}
return 0;
}