#include<iostream>
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=1e5+6;
int n,m,q;
struct node{
int l,r,max,min;
int zabs,fabs;
bool z;
}f1[MAXN*4+2],f2[MAXN*4+5];
int a[MAXN],b[MAXN];
int max(int a,int b)
{
if(a>b) return a;
return b;
}
int min(int a,int b)
{
if(a<b) return a;
return b;
}
void build1(int p,int x,int y)
{
f1[p].l=x;
f1[p].r=y;
if(x==y)
{
f1[p].max=a[x];
f1[p].min=a[x];
if(a[x]>0)
{
f1[p].zabs=a[x];
}
if(a[x]==0)
{
f1[p].z=1;
}
if(a[x]<0)
{
f1[p].fabs=a[x];
}
return;
}
int mid=(x+y)>>1;
build1(p*2,x,mid);
build1(p*2+1,mid+1,y);
f1[p].max=max(f1[p*2].max,f1[p*2+1].max);
f1[p].min=min(f1[p*2].min,f1[p*2+1].min);
f1[p].zabs=min(f1[p*2].zabs,f1[p*2+1].zabs);
f1[p].fabs=max(f1[p*2].fabs,f1[p*2+1].fabs);
f1[p].z=f1[p*2].z|f1[p*2+1].z;
}
void build2(int p,int x,int y)
{
f2[p].l=x;
f2[p].r=y;
if(x==y)
{
f2[p].max=b[x];
f2[p].min=b[x];
if(b[x]>0)
{
f2[p].zabs=b[x];
}
if(b[x]==0)
{
f2[p].z=1;
}
if(b[x]<0)
{
f2[p].fabs=b[x];
}
return;
}
int mid=(x+y)>>1;
build2(p*2,x,mid);
build2(p*2+1,mid+1,y);
f2[p].max=max(f2[p*2].max,f2[p*2+1].max);
f2[p].min=min(f2[p*2].min,f2[p*2+1].min);
f2[p].zabs=min(f2[p*2].zabs,f2[p*2+1].zabs);
f2[p].fabs=max(f2[p*2].fabs,f2[p*2+1].fabs);
f2[p].z=f2[p*2].z|f2[p*2+1].z;
}
int max1,max2,min1,min2,z1,z2,zabs1,zabs2,fabs1,fabs2;
void ask1(int p,int x,int y)
{
if(f1[p].l>=x&&f1[p].r<=y)
{
max1=max(max1,f1[p].max);
min1=min(min1,f1[p].min);
zabs1=min(zabs1,f1[p].zabs);
fabs1=max(fabs1,f1[p].fabs);
z1=z1|f1[p].z;
return;
}
int mid=(f1[p].l+f1[p].r)>>1;
if(x<=mid) ask1(p*2,x,y);
if(y>mid) ask1(p*2+1,x,y);
}
void ask2(int p,int x,int y)
{
if(f2[p].l>=x&&f2[p].r<=y)
{
max2=max(max2,f2[p].max);
min2=min(min2,f2[p].min);
zabs2=min(zabs2,f2[p].zabs);
fabs2=max(fabs2,f2[p].fabs);
z2=z2|f2[p].z;
return ;
}
int mid=(f2[p].l+f2[p].r)>>1;
if(x<=mid) ask2(p*2,x,y);
if(y>mid) ask2(p*2+1,x,y);
}
signed main()
{
scanf("%lld%lld%lld",&n,&m,&q);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=m;i++) scanf("%lld",&b[i]);
int t;
n>m?t=n:t=m;
for(int i=1;i<=t*4;i++)
{
f1[i].min=1e10-8;
f2[i].min=1e10-8;
f1[i].zabs=1e10-8;
f1[i].fabs=-1e10-8;
f2[i].zabs=1e10-8;
f2[i].fabs=-1e10-8;
f1[i].max=-1e10+8;
f2[i].max=-1e10+8;
}
build1(1,1,n);
build2(1,1,m);
int x1,y1,x2,y2;
for(int i=1;i<=q;i++)
{
scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);
max1=-1e10+8;
max2=-1e10+8;
min1=1e10-8;
min2=1e10-8;
z1=0;
z2=0;
zabs1=1e10+8;
zabs2=1e10+8;
fabs1=-1e10+8;
fabs2=-1e10+8;
ask1(1,x1,y1);
ask2(1,x2,y2);
if(min2>0)
{
if(max1>0)
{
if(z2==1)
{
cout<<0<<endl;
continue;
}
cout<<max1*min2<<endl;
continue;
}
if(max1<0)
{
if(z1==1)
{
cout<<0<<endl;
continue;
}
cout<<max1*max2<<endl;
continue;
}
}
if(max2<0)
{
if(min1<0)
{
if(z2==1)
{
cout<<0<<endl;
continue;
}
cout<<min1*max2<<endl;
continue;
}
if(min1>0)
{
if(z1==1)
{
cout<<0<<endl;
continue;
}
cout<<min1*min2<<endl;
continue;
}
}
if(max2>0&&min2<0)
{
if(z1==1)
{
cout<<0<<endl;
continue;
}
if(max1<0)
{
cout<<max1*max2<<endl;
continue;
}
if(min1>0)
{
cout<<min1*min2<<endl;
continue;
}
if(max1>0&&min1<0)
{
int ans=-1e18+8;
ans=max(fabs1*max2,zabs1*min2);
cout<<ans<<endl;
continue;
}
}
}
return 0;
}