rt,WA on 13#
#include<bits/stdc++.h>
#define int long long
#define mid ((l+r)>>1)
#define ls (k<<1)
#define rs ((k<<1)|1)
using namespace std;
const int N=1e5+5;
const int inf=LONG_LONG_MAX;
int n,m,q,a[N],b[N],bm[N<<2],bmn[N<<2],am[N<<2],amn[N<<2],az[N<<2],af[N<<2];
inline int re() {
int f=1,x=0;
char ch=getchar();
while(!isdigit(ch)) {
f=ch=='-'?-f:f;
ch=getchar();
}
while(isdigit(ch)) {
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return f*x;
}
inline int minn(int a,int b) {
if(a == -inf) return b;
if(b == -inf) return a;
return min(a,b);
}
inline int maxx(int a,int b) {
if(a == inf) return b;
if(b == inf) return a;
return max(a,b);
}
inline void upda(int k) {
am[k]=max(am[ls],am[rs]);
amn[k]=min(amn[ls],amn[rs]);
az[k]=minn(az[ls],az[rs]);
af[k]=maxx(af[ls],af[rs]);
}
inline void updb(int k) {
bm[k]=max(bm[ls],bm[rs]);
bmn[k]=min(bmn[ls],bmn[rs]);
}
inline void builda(int k,int l,int r) {
if(l==r) {
am[k]=amn[k]=a[l];
if(a[l]>=0) az[k]=a[l],af[k]=inf;
else af[k]=a[l],az[k]=-inf;
return ;
}
builda(ls,l,mid);
builda(rs,mid+1,r);
upda(k);
}
inline void buildb(int k,int l,int r) {
if(l==r) {
bm[k]=bmn[k]=b[l];
return ;
}
buildb(ls,l,mid);
buildb(rs,mid+1,r);
updb(k);
}
inline int qrybm(int k,int l,int r,int al,int ar) {
if(al<=l && r<=ar) return bm[k];
int ans=-inf;
if(al<=mid) ans=max(ans,qrybm(ls,l,mid,al,ar));
if(mid<ar) ans=max(ans,qrybm(rs,mid+1,r,al,ar));
return ans;
}
inline int qrybmn(int k,int l,int r,int al,int ar) {
if(al<=l && r<=ar) return bmn[k];
int ans=inf;
if(al<=mid) ans=min(ans,qrybmn(ls,l,mid,al,ar));
if(mid<ar) ans=min(ans,qrybmn(rs,mid+1,r,al,ar));
return ans;
}
inline int qryam(int k,int l,int r,int al,int ar) {
if(al<=l && r<=ar) return am[k];
int ans=-inf;
if(al<=mid) ans=max(ans,qryam(ls,l,mid,al,ar));
if(mid<ar) ans=max(ans,qryam(rs,mid+1,r,al,ar));
return ans;
}
inline int qryamn(int k,int l,int r,int al,int ar) {
if(al<=l && r<=ar) return amn[k];
int ans=inf;
if(al<=mid) ans=min(ans,qryamn(ls,l,mid,al,ar));
if(mid<ar) ans=min(ans,qryamn(rs,mid+1,r,al,ar));
return ans;
}
inline int qryaz(int k,int l,int r,int al,int ar) {
if(al<=l && r<=ar) return az[k];
int ans=inf;
if(al<=mid) ans=minn(ans,qryaz(ls,l,mid,al,ar));
if(mid<ar) ans=minn(ans,qryaz(rs,mid+1,r,al,ar));
return ans;
}
inline int qryaf(int k,int l,int r,int al,int ar) {
if(al<=l && r<=ar) return af[k];
int ans=-inf;
if(al<=mid) ans=maxx(ans,qryaf(ls,l,mid,al,ar));
if(mid<ar) ans=maxx(ans,qryaf(rs,mid+1,r,al,ar));
return ans;
}
inline void solve() {
int la=re(),ra=re(),lb=re(),rb=re();
int amax=qryam(1,1,n,la,ra);
int amin=qryamn(1,1,n,la,ra);
int azm=qryaz(1,1,n,la,ra);
int afm=qryaf(1,1,n,la,ra);
int bmax=qrybm(1,1,m,lb,rb);
int bmin=qrybmn(1,1,m,lb,rb);
int ans=-inf;
ans=max(ans,amax*(amax>=0?bmin:bmax));
ans=max(ans,amin*(amin>=0?bmin:bmax));
if(afm!=-inf) ans=max(ans,afm*(afm>=0?bmin:bmax));
if(azm!=inf) ans=max(ans,azm*(azm>=0?bmin:bmax));
cout<<ans<<endl;
}
signed main() {
n=re(),m=re(),q=re();
for(int i=1; i<=n; i++) a[i]=re();
for(int i=1; i<=m; i++) b[i]=re();
builda(1,1,n);
buildb(1,1,m);
while(q--) solve();
return 0;
}