#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e7+20;
int a[N][2];
struct node{
int l;
int r;
int upm;
int dom;
int mxx;
int mnn;
}tr[N][2];
void push_up(int u,int num)
{
tr[u][num].dom=max(tr[u<<1][num].dom,tr[u<<1|1][num].dom);
tr[u][num].mxx=max(tr[u<<1][num].mxx,tr[u<<1|1][num].mxx);
tr[u][num].mnn=min(tr[u<<1][num].mnn,tr[u<<1|1][num].mnn);
tr[u][num].upm=min(tr[u<<1][num].upm,tr[u<<1|1][num].upm);
}
void build(int u,int l,int r,int num)
{
tr[u][num].l=l;
tr[u][num].r=r;
if(l==r)
{
tr[u][num].mxx=tr[u][num].mnn=a[l][num];
if(a[l][num]>=0)tr[u][num].dom=-0x3f3f3f3f,tr[u][num].upm=a[l][num];
else if(a[l][num]<=0)tr[u][num].upm=0x3f3f3f3f,tr[u][num].dom=a[l][num];
return ;
}
int mid=l+r>>1;
build(u<<1,l,mid,num);
build(u<<1|1,mid+1,r,num);
push_up(u,num);
}
int query1(int u,int l,int r,int num)
{
if(tr[u][num].l>=l&&tr[u][num].r<=r)return tr[u][num].upm;
else
{
int mid=tr[u][num].l+tr[u][num].r>>1;
int ans=0x3f3f3f3f;
if(l<=mid)ans=min(ans,query1(u<<1,l,r,num));
if(r>mid)ans=min(ans,query1(u<<1|1,l,r,num));
return ans;
}
}
int query2(int u,int l,int r,int num)
{
if(tr[u][num].l>=l&&tr[u][num].r<=r)return tr[u][num].dom;
else
{
int mid=tr[u][num].l+tr[u][num].r>>1;
int ans=-0x3f3f3f3f;
if(l<=mid)ans=max(ans,query2(u<<1,l,r,num));
if(r>mid)ans=max(ans,query2(u<<1|1,l,r,num));
return ans;
}
}
int query3(int u,int l,int r,int num)
{
if(tr[u][num].l>=l&&tr[u][num].r<=r)return tr[u][num].mxx;
else
{
int mid=tr[u][num].l+tr[u][num].r>>1;
int ans=-0x3f3f3f3f;
if(l<=mid)ans=max(ans,query3(u<<1,l,r,num));
if(r>mid)ans=max(ans,query3(u<<1|1,l,r,num));
return ans;
}
}
int query4(int u,int l,int r,int num)
{
if(tr[u][num].l>=l&&tr[u][num].r<=r)return tr[u][num].mnn;
else
{
int mid=tr[u][num].l+tr[u][num].r>>1;
int ans=0x3f3f3f3f;
if(l<=mid)ans=min(ans,query4(u<<1,l,r,num));
if(r>mid)ans=min(ans,query4(u<<1|1,l,r,num));
return ans;
}
}
int n,m,q;
signed main(void)
{
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
cin>>a[i][0];
for(int j=1;j<=m;j++)
cin>>a[j][1];
build(1,1,n,0);
build(1,1,m,1);
while(q--)
{
int l1,r1,l2,r2;
cin>>l1>>r1>>l2>>r2;
int ans1=query3(1,l1,r1,0)*query4(1,l2,r2,1);
int ans4=query3(1,l1,r1,0)*query3(1,l2,r2,1);
int ans2=query4(1,l1,r1,0)*query3(1,l2,r2,1);
int ans3=query4(1,l1,r1,0)*query4(1,l2,r2,1);
int ans5=query1(1,l1,r1,0)*query4(1,l2,r2,1);
if(ans5>0x3f3f3f3f)ans5=-ans5;
int ans6=query2(1,l1,r1,0)*query3(1,l2,r2,1);
if(ans6>0x3f3f3f3f)ans6=-ans6;
cout<<max(min(ans1,ans4),max(min(ans2,ans3),max(min(ans1,ans4),max(ans5,ans6))))<<endl;
}
return 0;
}