#include<iostream>
using namespace std;
const int N=1e6+5;
const long long MAX_=1e9+3;
const long long MIN_=-1e9+3;
const long long MIN=-1e16;
long long n,m,q;
long long a[N],b[N],maxa[N],mina[N];
long long la,lb,ra,rb;
long long ans;
long long treeminx[N<<2];
void buildminx(long long l,long long r,int i){
if(l==r){
treeminx[i]=a[l];
return;
}
long long mid=(l+r)/2;
buildminx(l,mid,i*2);
buildminx(mid+1,r,i*2+1);
treeminx[i]=min(treeminx[i*2],treeminx[i*2+1]);
}
long long cminx(long long sl,long long sr,long long l,long long r,int i){
if(l==r||(sl==l&&sr==r)) return treeminx[i];
long long mid=(l+r)/2;
if(sl<=mid&&sr>mid) return min(cminx(sl,mid,l,mid,i*2),cminx(mid+1,sr,mid+1,r,i*2+1));
else if(sr<=mid) return cminx(sl,sr,l,mid,i*2);
else return cminx(sl,sr,mid+1,r,i*2+1);
}
long long treemaxx[N<<2];
void buildmaxx(long long l,long long r,int i){
if(l==r){
treemaxx[i]=a[l];
return ;
}
long long mid=(l+r)/2;
buildmaxx(l,mid,i*2);
buildmaxx(mid+1,r,i*2+1);
treemaxx[i]=max(treemaxx[i*2],treemaxx[i*2+1]);
}
long long cmaxx(long long sl,long long sr,long long l,long long r,int i){
if(l==r||(sl==l&&sr==r)) return treemaxx[i];
long long mid=(l+r)/2;
if(sl<=mid&&sr>mid) return max(cmaxx(sl,mid,l,mid,i*2),cmaxx(mid+1,sr,mid+1,r,i*2+1));
else if(sr<=mid) return cmaxx(sl,sr,l,mid,i*2);
else return cmaxx(sl,sr,mid+1,r,i*2+1);
}
long long treeminfx[N<<2];
void buildminfx(long long l,long long r,int i){
if(l==r){
treeminfx[i]=mina[l];
return;
}
long long mid=(l+r)/2;
buildminfx(l,mid,i*2);
buildminfx(mid+1,r,i*2+1);
treeminfx[i]=min(treeminfx[i*2],treeminfx[i*2+1]);
}
long long cminfx(long long sl,long long sr,long long l,long long r,int i){
if(l==r||(sl==l&&sr==r)) return treeminfx[i];
long long mid=(l+r)/2;
if(sl<=mid&&sr>mid) return min(cminfx(sl,mid,l,mid,i*2),cminfx(mid+1,sr,mid+1,r,i*2+1));
else if(sr<=mid) return cminfx(sl,sr,l,mid,i*2);
else return cminfx(sl,sr,mid+1,r,i*2+1);
}
long long treemaxfx[N<<2];
void buildmaxfx(long long l,long long r,int i){
if(l==r){
treemaxfx[i]=maxa[l];
return ;
}
long long mid=(l+r)/2;
buildmaxfx(l,mid,i*2);
buildmaxfx(mid+1,r,i*2+1);
treemaxfx[i]=max(treemaxfx[i*2],treemaxfx[i*2+1]);
}
long long cmaxfx(long long sl,long long sr,long long l,long long r,int i){
if(l==r||(sl==l&&sr==r)) return treemaxfx[i];
long long mid=(l+r)/2;
if(sl<=mid&&sr>mid) return max(cmaxfx(sl,mid,l,mid,i*2),cmaxfx(mid+1,sr,mid+1,r,i*2+1));
else if(sr<=mid) return cmaxfx(sl,sr,l,mid,i*2);
else return cmaxfx(sl,sr,mid+1,r,i*2+1);
}
long long treemaxy[N<<2];
void buildmaxy(long long l,long long r,int i){
if(l==r){
treemaxy[i]=b[l];
return ;
}
long long mid=(l+r)/2;
buildmaxy(l,mid,i*2);
buildmaxy(mid+1,r,i*2+1);
treemaxy[i]=max(treemaxy[i*2],treemaxy[i*2+1]);
}
long long cmaxy(long long sl,long long sr,long long l,long long r,int i){
if(l==r||(sl==l&&sr==r)) return treemaxy[i];
long long mid=(l+r)/2;
if(sl<=mid&&sr>mid) return max(cmaxy(sl,mid,l,mid,i*2),cmaxy(mid+1,sr,mid+1,r,i*2+1));
else if(sr<=mid) return cmaxy(sl,sr,l,mid,i*2);
else return cmaxy(sl,sr,mid+1,r,i*2+1);
}
long long treeminy[N<<2];
void buildminy(long long l,long long r,int i){
if(l==r){
treeminy[i]=b[l];
return;
}
long long mid=(l+r)/2;
buildminy(l,mid,i*2);
buildminy(mid+1,r,i*2+1);
treeminy[i]=min(treeminy[i*2],treeminy[i*2+1]);
}
long long cminy(long long sl,long long sr,long long l,long long r,int i){
if(l==r||(sl==l&&sr==r)) return treeminy[i];
long long mid=(l+r)/2;
if(sl<=mid&&sr>mid) return min(cminy(sl,mid,l,mid,i*2),cminy(mid+1,sr,mid+1,r,i*2+1));
else if(sr<=mid) return cminy(sl,sr,l,mid,i*2);
else return cminy(sl,sr,mid+1,r,i*2+1);
}
int main(){
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
maxa[i]=a[i];
if(maxa[i]>=0) maxa[i]=MIN_;
mina[i]=a[i];
if(mina[i]<0) mina[i]=MAX_;
}
for(int i=1;i<=m;i++) cin>>b[i];
buildminx(1,n,1);
buildmaxx(1,n,1);
buildminfx(1,n,1);
buildmaxfx(1,n,1);
buildminy(1,n,1);
buildmaxy(1,n,1);
long long maxx,minx,maxfx,minfx,maxy,miny;
while(q--){
ans=MIN;
cin>>la>>lb>>ra>>rb;
minx=cminx(la,lb,1,n,1);
maxx=cmaxx(la,lb,1,n,1);
maxfx=cmaxfx(la,lb,1,n,1);
minfx=cminfx(la,lb,1,n,1);
maxy=cmaxy(ra,rb,1,n,1);
miny=cminy(ra,rb,1,n,1);
if(minx<0) ans=max(ans,minx*maxy);
else ans=max(ans,minx*miny);
if(minfx<0) ans=max(ans,minfx*maxy);
else ans=max(ans,minfx*miny);
if(maxx<0) ans=max(ans,maxx*maxy);
else ans=max(ans,maxx*miny);
if(maxfx<0) ans=max(ans,maxfx*maxy);
else ans=max(ans,maxfx*miny);
cout<<ans<<endl;
}
return 0;
}