#include<bits/stdc++.h>
#define lc p<<1
#define rc p<<1|1
using namespace std;
const long long N=1e5+10;
inline long long read(){
long long f=1,k=0;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-f;
c=getchar();
}
while(c>='0'&&c<='9') k=k*10+c-'0',c=getchar();
return f*k;
}
inline void print(long long x){
if(x<0) putchar('-'),x=-x;
if(x<10) putchar(x+'0');
else print(x/10),putchar(x%10+'0');
}
long long n,m,q,l1,r1,l2,r2,a[N],b[N];
struct node{
long long l,r,zmx,fmx,zmi,fmi;
}tra[N<<2];
struct edge{
long long l,r,mx,mi;
}trb[N<<2];
inline void pushupa(long long p){
tra[p].zmx=max(tra[lc].zmx,tra[rc].zmx);
tra[p].zmi=min(tra[lc].zmi,tra[rc].zmi);
tra[p].fmx=max(tra[lc].fmx,tra[rc].fmx);
tra[p].fmi=min(tra[lc].fmi,tra[rc].fmi);
}
inline void pushupb(long long p){
trb[p].mx=max(trb[lc].mx,trb[rc].mx);
trb[p].mi=min(trb[lc].mi,trb[rc].mi);
}
inline void builda(long long p,long long l,long long r){
if(a[l]>=0) tra[p]={l,r,a[l],a[l],a[l],a[l]};
else tra[p]={l,r,a[l],a[l],a[l],a[l]};
if(l==r) return ;
long long m=l+r>>1;
builda(lc,l,m);
builda(rc,m+1,r);
pushupa(p);
}
inline void buildb(long long p,long long l,long long r){
trb[p]={l,r,b[l],b[l]};
if(l==r) return ;
long long m=l+r>>1;
buildb(lc,l,m);
buildb(rc,m+1,r);
pushupb(p);
}
inline long long querya1(long long p,long long x,long long y){
if(x<=tra[p].l&&y>=tra[p].r) return tra[p].zmx;
long long ans=-9e18;
long long m=tra[p].l+tra[p].r>>1;
if(x<=m) ans=max(ans,querya1(lc,x,y));
if(y>m) ans=max(ans,querya1(rc,x,y));
return ans;
}
inline long long querya2(long long p,long long x,long long y){
if(x<=tra[p].l&&y>=tra[p].r) return tra[p].zmi;
long long ans=9e18;
long long m=tra[p].l+tra[p].r>>1;
if(x<=m) ans=min(ans,querya2(lc,x,y));
if(y>m) ans=min(ans,querya2(rc,x,y));
return ans;
}
inline long long querya3(long long p,long long x,long long y){
if(x<=tra[p].l&&y>=tra[p].r) return tra[p].fmx;
long long ans=-9e18;
long long m=tra[p].l+tra[p].r>>1;
if(x<=m) ans=max(ans,querya3(lc,x,y));
if(y>m) ans=max(ans,querya3(rc,x,y));
return ans;
}
inline long long querya4(long long p,long long x,long long y){
if(x<=tra[p].l&&y>=tra[p].r) return tra[p].fmi;
long long ans=9e18;
long long m=tra[p].l+tra[p].r>>1;
if(x<=m) ans=min(ans,querya4(lc,x,y));
if(y>m) ans=min(ans,querya4(rc,x,y));
return ans;
}
inline long long queryb1(long long p,long long x,long long y){
if(x<=trb[p].l&&y>=trb[p].r) return trb[p].mx;
long long ans=-9e18;
long long m=trb[p].l+trb[p].r>>1;
if(x<=m) ans=max(ans,queryb1(lc,x,y));
if(y>m) ans=max(ans,queryb1(rc,x,y));
return ans;
}
inline long long queryb2(long long p,long long x,long long y){
if(x<=trb[p].l&&y>=trb[p].r) return trb[p].mi;
long long ans=9e18;
long long m=trb[p].l+trb[p].r>>1;
if(x<=m) ans=min(ans,queryb2(lc,x,y));
if(y>m) ans=min(ans,queryb2(rc,x,y));
return ans;
}
int main(){
n=read(),m=read(),q=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=m;i++) b[i]=read();
builda(1,1,n);buildb(1,1,m);
while(q--){
l1=read(),r1=read(),l2=read(),r2=read();
long long amax=querya1(1,l1,r1);
long long amin=querya4(1,l1,r1);
long long afmx=querya3(1,l1,r1);
long long azmn=querya2(1,l1,r1);
long long bmax=queryb1(1,l2,r2);
long long bmin=queryb2(1,l2,r2);
long long ans=-9e18;
if(amax>=0) ans=max(ans,amax*bmin);
else ans=max(ans,amax*bmax);
if(amin>=0) ans=max(ans,amin*bmin);
else ans=max(ans,amin*bmax);
if(afmx!=(long long)-9e18){
if(afmx>=0) ans=max(ans,afmx*bmin);
else ans=max(ans,afmx*bmax);
}
if(azmn!=(long long)-9e18){
if(azmn>=0) ans=max(ans,azmn*bmin);
else ans=max(ans,azmn*bmax);
}
print(ans);putchar('\n');
}
return 0;
}