#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<set>
#include<vector>
#define int long long
#define ls t*2
#define rs t*2+1
using namespace std;
const int N = 100019,M=1e24;
int mx(int i,int j){return (i>j)?i:j;}
int mn(int i,int j){return (i<j)?i:j;}
int n,m,ay[N],by[N],qu;
struct node{int mx,mn,mxf,mnz;}a[N*4],b[N*4];
inline int read(){
int f=1,ss=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9'){ss=ss*10+c-'0';c=getchar();}
return ss*f;
}
void pushup(int t,node c[]){
c[t].mx=mx(c[ls].mx,c[rs].mx);c[t].mn=mn(c[ls].mn,c[rs].mn);
c[t].mnz=mn(c[ls].mnz,c[rs].mnz);
c[t].mxf=mx(c[ls].mxf,c[rs].mxf);
}
void build(int t,int l,int r,int c[],node p[]){
if(l==r) {
p[t].mx=p[t].mn=c[l];
p[t].mnz=(c[l]>=0)?c[l]:M;
p[t].mxf=(c[l]<=0)?c[l]:-M;
return ;
}
int mid=(l+r)>>1;
build(ls,l,mid,c,p);build(rs,mid+1,r,c,p);
pushup(t,p);
}
node query(int t,int tl,int tr,int l,int r,node c[]){
if(l<=tl&&tr<=r) {return c[t];}
int mid=(tl+tr)>>1;
int mxx=-M,mnn=M,mxxf=-M,mnnz=M;
if(l<=mid) {
node T=query(ls,tl,mid,l,r,c);
mxx=mx(T.mx,mxx);mnn=mn(T.mn,mnn);
mxxf=mx(T.mxf,mxxf);mnnz=mn(T.mnz,mnnz);
}
if(r>mid) {
node T=query(rs,mid+1,tr,l,r,c);
mxx=mx(T.mx,mxx);mnn=mn(T.mn,mnn);
mxxf=mx(T.mxf,mxxf);mnnz=mn(T.mnz,mnnz);
}
return (node){mxx,mnn,mxxf,mnnz};
}
signed main(){
n=read();m=read();qu=read();
for(int i=1;i<=n;i++) ay[i]=read();
for(int i=1;i<=m;i++) by[i]=read();
build(1,1,n,ay,a);build(1,1,m,by,b);
int l1,r1,l2,r2;
while(qu--){
l1=read();r1=read();l2=read();r2=read();
int ans=M;
node ansa=query(1,1,n,l1,r1,a),ansb=query(1,1,m,l2,r2,b);
if(ansb.mx<=0) {if(ansa.mn<0) ans=ansa.mn*ansb.mx;else ans=ansa.mn*ansb.mx;}
else if(ansb.mn>=0)
{if(ansa.mx<0) ans=ansa.mx*ansb.mx;else ans=ansa.mx*ansb.mn;}
else {
ans=-M;
if(ansa.mx>=0) ans=mx(ans,ansa.mnz*ansb.mn);
if(ansa.mn<=0) ans=mx(ans,ansa.mxf*ansb.mx);
if(ansa.mnz==0) ans=0;
}
printf("%lld\n",ans);
}
return 0;
}