#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const long long N=1e6+10;
const long long M=1e3+10;
long long n,m,q;
struct Node{
long long maxz,minz,maxf,minf,zero;
}pa[N],pb[N];
long long a[N],b[N];
Node merge(Node x,Node y){
Node ans;
ans.zero=x.zero||y.zero;
if(!x.maxz||!y.maxz){
ans.maxz=x.maxz+y.maxz;
ans.minz=x.minz+y.minz;
}else{
ans.maxz=max(x.maxz,y.maxz);
ans.minz=min(x.minz,y.minz);
}
if(!x.maxf||!y.maxf){
ans.maxf=x.maxf+y.maxf;
ans.minf=x.minf+y.minf;
}else{
ans.maxf=max(x.maxf,y.maxf);
ans.minf=min(x.minf,y.minf);
}
return ans;
}
Node push(long long k){
Node ans11;
ans11.maxf=ans11.maxz=ans11.minf=ans11.minz=ans11.zero=0;
if(k==0) ans11.zero=1;
if(k<0) ans11.minf=ans11.maxf=k;
if(k>0) ans11.maxz=ans11.minz=k;
return ans11;
}
void builda(long long l,long long r,long long k){
if(l==r){
pa[k]=push(a[l]);
return ;
}
long long mid=(l+r)/2;
builda(l,mid,k*2);
builda(mid+1,r,k*2+1);
pa[k]=merge(pa[k*2],pa[k*2+1]);
}
void buildb(long long l,long long r,long long k){
if(l==r){
pb[k]=push(b[l]);
return ;
}
long long mid=(l+r)/2;
buildb(l,mid,k*2);
buildb(mid+1,r,k*2+1);
pb[k]=merge(pb[k*2],pb[k*2+1]);
}
Node finda(long long l,long long r,long long s,long long t,long long k){
if(l<=s&&t<=r){
return pa[k];
}
long long mid=(s+t)/2;
if(l>mid){
return finda(l,r,mid+1,t,k*2+1);
}
if(r<=mid+1){
return finda(l,r,s,mid,k*2);
}
return merge(finda(l,r,mid+1,t,k*2+1),finda(l,r,s,mid,k*2));
}
Node findb(long long l,long long r,long long s,long long t,long long k){
if(l<=s&&t<=r){
return pb[k];
}
long long mid=(s+t)/2;
if(l>mid){
return findb(l,r,mid+1,t,k*2+1);
}
if(r<=mid+1){
return findb(l,r,s,mid,k*2);
}
return merge(findb(l,r,mid+1,t,k*2+1),findb(l,r,s,mid,k*2));
}
void init(){
cin>>n>>m>>q;
for(long long i=1;i<=n;i++){
cin>>a[i];
}
for(long long i=1;i<=m;i++){
cin>>b[i];
}
builda(1,n,1);
buildb(1,m,1);
}
long long Ans(Node x,Node y){
long long ans;
if(y.minf!=0&&y.minz==0){
if(x.minz!=0){
if(y.zero){
ans=0;
}else{
ans=x.minf*y.maxf;
}
}else{
if(x.zero){
ans=0;
}else{
ans=x.minz*y.minf;
}
}
}
else if(y.minf==0&&y.minz!=0){
if(x.minz!=0){
if(y.zero){
ans=0;
}else{
ans=x.maxz*y.minz;
}
}else{
if(x.zero){
ans=0;
}else{
ans=x.maxf*y.maxz;
}
}
}else{
if(x.zero) ans=0;
if(x.minf!=0&&x.minz==0){
ans=x.maxf*y.maxz;
}
if(x.minf==0&&x.minz!=0){
ans=x.minz*y.minf;
}
ans=max(x.minz*y.minf,x.maxf*y.maxz);
}
return ans;
}
int main(){
init();
while(q--){
long long l1,r1,r2,l2;
cin>>l1>>r1>>l2>>r2;
Node x=finda(l1,r1,1,n,1);
Node y=findb(l2,r2,1,m,1);
cout<<Ans(x,y)<<endl;
}
return 0;
}