#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lc (p<<1)
#define rc ((p<<1)|1)
#define mid ((l+r)>>1)
const int inf=1e18+10,N=1e5+10;
int a[N],b[N],a2[N],a3[N],n,q,m;
struct node{
int l,r,mx,mi,nx,pi;
}tr[N<<2];
struct node2{
int l,r,mx,mi;
}tr2[N<<2];
inline int rd(){
int x=1,y=0;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') x=-x;ch=getchar();}
while(isdigit(ch)){y=(y<<3)+(y<<1)+(ch^48);ch=getchar();}
return x*y;
}
inline void w(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) w(x/10);putchar(x%10^48);
}
inline void pushup(int p){
tr[p].mi=min(tr[lc].mi,tr[rc].mi);
tr[p].mx=max(tr[lc].mx,tr[rc].mx);
tr[p].nx=max(tr[lc].nx,tr[rc].nx);
tr[p].pi=min(tr[lc].pi,tr[rc].pi);
}
inline void pushup2(int p){
tr2[p].mx=max(tr2[lc].mx,tr2[rc].mx);
tr2[p].mi=min(tr2[lc].mi,tr2[rc].mi);
}
inline void build(int p,int l,int r){
tr[p]=node{l,r,a[l],a[l],a2[l],a3[l]};
if(l==r) return;
build(lc,l,mid);build(rc,mid+1,r);
pushup(p);
}
inline void build2(int p,int l,int r){
tr2[p]=node2{l,r,b[l],b[l]};
if(l==r) return;
build(lc,l,mid);build(rc,mid+1,r);
pushup2(p);
}
inline int query(int p,int x,int y){
int l=tr[p].l,r=tr[p].r;
if(x<=l&&r<=y) return tr[p].mx;
int res=INT_MIN;
if(x<=mid) res=max(res,query(lc,x,y));
if(y>mid) res=max(res,query(rc,x,y));
return res;
}
inline int query2(int p,int x,int y){
int l=tr[p].l,r=tr[p].r;
if(x<=l&&r<=y) return tr[p].mi;
int res=INT_MAX;
if(x<=mid) res=min(res,query2(lc,x,y));
if(y>mid) res=min(res,query2(rc,x,y));
return res;
}
inline int query3(int p,int x,int y){
int l=tr[p].l,r=tr[p].r;
if(x<=l&&r<=y) return tr[p].nx;
int res=INT_MIN;
if(x<=mid) res=max(res,query3(lc,x,y));
if(y>mid) res=max(res,query3(rc,x,y));
return res;
}
inline int query4(int p,int x,int y){
int l=tr[p].l,r=tr[p].r;
if(x<=l&&r<=y) return tr[p].pi;
int res=INT_MAX;
if(x<=mid) res=min(res,query4(lc,x,y));
if(y>mid) res=min(res,query4(rc,x,y));
return res;
}
inline int query5(int p,int x,int y){
int l=tr2[p].l,r=tr2[p].r;
if(x<=l&&r<=y) return tr2[p].mx;
int res=INT_MIN;
if(x<=mid) res=max(res,query5(lc,x,y));
if(y>mid) res=max(res,query5(rc,x,y));
return res;
}
inline int query6(int p,int x,int y){
int l=tr2[p].l,r=tr2[p].r;
if(x<=l&&r<=y) return tr2[p].mi;
int res=INT_MAX;
if(x<=mid) res=min(res,query6(lc,x,y));
if(y>mid) res=min(res,query6(rc,x,y));
return res;
}
inline int duice(int x,int bmx,int bmi){return (x>=0?bmi:bmx);}
signed main(){
n=rd();m=rd();q=rd();
for(int i=1;i<=n;i++){
a[i]=rd();a2[i]=(a[i]>=0?-inf:a[i]);
a3[i]=(a[i]<0?inf:a[i]);
}
for(int i=1;i<=m;i++) b[i]=rd();
build(1,1,n);build2(1,1,m);
while(q--){
int a1=rd(),b1=rd(),c1=rd(),d1=rd();
int amx=query(1,a1,b1),ami=query2(1,a1,b1),anx=query3(1,a1,b1),api=query4(1,a1,b1),bmx=query5(1,c1,d1),bmi=query6(1,c1,d1),ans=-inf;
ans=max({ans,amx*duice(amx,bmx,bmi),ami*duice(ami,bmx,bmi)});
if(anx!=-inf) ans=max(ans,anx*duice(anx,bmx,bmi));
if(api!=inf) ans=max(ans,api*duice(api,bmx,bmi));
w(ans);putchar('\n');
}
return 0;
}