rt
#include<bits/stdc++.h>
#define int long long
#define ls (o<<1)
#define rs (o<<1|1)
using namespace std;
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
return x*f;
}
const int maxn=114514;
int a[maxn],b[maxn],mx[maxn<<2],mn[maxn<<2],mn1[maxn<<2],mx1[maxn<<2];
void pushup(int o){
mx[o]=max(mx[ls],mx[rs]);
mn[o]=min(mn[ls],mn[rs]);
}
void pushup1(int o){
mn1[o]=min(mn1[ls],mn1[rs]);
mx1[o]=max(mx1[ls],mx1[rs]);
}
void build(int o,int l,int r){
if(l==r) return mn[o]=mx[o]=a[l],void();
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(o);
}
void build1(int o,int l,int r){
if(l==r) return mn1[o]=mx1[o]=b[l],void();
int mid=(l+r)>>1;
build1(ls,l,mid);
build1(rs,mid+1,r);
pushup1(o);
}
int querymin(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return mn[o];
int rt=0x3f3f3f3f,mid=(l+r)>>1;
if(ql<=mid) rt=min(rt,querymin(ls,l,mid,ql,qr));
if(qr>mid) rt=min(rt,querymin(rs,mid+1,r,ql,qr));
pushup(o);
return rt;
}
int querymin1(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return mn1[o];
int rt=0x3f3f3f3f,mid=(l+r)>>1;
if(ql<=mid) rt=min(rt,querymin1(ls,l,mid,ql,qr));
if(qr>mid) rt=min(rt,querymin1(rs,mid+1,r,ql,qr));
pushup1(o);
return rt;
}
int querymax(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return mx[o];
int rt=-0x3f3f3f3f,mid=(l+r)>>1;
if(ql<=mid) rt=max(rt,querymax(ls,l,mid,ql,qr));
if(qr>mid) rt=max(rt,querymax(rs,mid+1,r,ql,qr));
pushup(o);
return rt;
}
int querymax1(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return mx1[o];
int rt=-0x3f3f3f3f,mid=(l+r)>>1;
if(ql<=mid) rt=max(rt,querymax1(ls,l,mid,ql,qr));
if(qr>mid) rt=max(rt,querymax1(rs,mid+1,r,ql,qr));
pushup1(o);
return rt;
}
int c[maxn<<2],d[maxn<<2],tc[maxn<<2],td[maxn<<2];
void build2(int o,int l,int r){
if(l==r) return tc[o]=c[l],void();
int mid=(l+r)>>1;
build2(ls,l,mid);
build2(rs,mid+1,r);
tc[o]=min(tc[ls],tc[rs]);
}
void build3(int o,int l,int r){
if(l==r) return td[o]=d[l],void();
int mid=(l+r)>>1;
build3(ls,l,mid);
build3(rs,mid+1,r);
td[o]=max(td[ls],td[rs]);
}
int querymin2(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return tc[o];
int rt=0x3f3f3f3f,mid=(l+r)>>1;
if(ql<=mid) rt=min(rt,querymin2(ls,l,mid,ql,qr));
if(qr>mid) rt=min(rt,querymin2(rs,mid+1,r,ql,qr));
tc[o]=min(tc[ls],tc[rs]);
return rt;
}
int querymax2(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr) return td[o];
int rt=-0x3f3f3f3f,mid=(l+r)>>1;
if(ql<=mid) rt=max(rt,querymax2(ls,l,mid,ql,qr));
if(qr>mid) rt=max(rt,querymax2(rs,mid+1,r,ql,qr));
td[o]=max(td[ls],td[rs]);
return rt;
}
signed main(){
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
int 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();
for(int i=1;i<=n;i++){
if(a[i]==0) c[i]=d[i]=0;
else if(a[i]<0) c[i]=0x3f3f3f3f,d[i]=a[i];
else c[i]=a[i],d[i]=-0x3f3f3f3f;
}
build(1,1,n);
build1(1,1,m);
build2(1,1,n);
build3(1,1,n);
while(q--){
int l1=read(),r1=read(),l2=read(),r2=read(),ans=0;
int amn=querymin(1,1,n,l1,r1),bmn=querymin1(1,1,m,l2,r2),amx=querymax(1,1,n,l1,r1),bmx=querymax1(1,1,m,l2,r2);
if(bmn<0){//have negative number
if(amn>=0){//dont have negative
ans=bmn*amn;
printf("%lld\n",ans);
continue;
}
else{
if(bmx<=0){
ans=bmx*amn;
printf("%lld\n",ans);
continue;
}
else{
int cmn=querymin2(1,1,n,l1,r1),dmx=querymax2(1,1,n,l1,r1);
ans=max(cmn*bmn,dmx*bmx);
printf("%lld\n",ans);
continue;
}
}
}
else{// dont have negative number
int dmx=querymax2(1,1,n,l1,r1);
int p=bmn*amx,q=dmx*bmx;
if(p<0&&q<0) ans=min(p,q);
else if(p>0) ans=p;
printf("%lld\n",ans);
continue;
}
}
return 0;
}