#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define INF 1000000001
#define ll long long
int n,m,q;
int a[N],b[N];
struct node
{
int l;
int r;
ll maxsum;
ll minsum;
ll zmax;
ll zmin;
} ta[N*4],tb[N*4];
void build1(int id,int l,int r)
{
if (l==r)
{
ta[id].l = l;
ta[id].r = r;
ta[id].maxsum = a[l];
ta[id].minsum = a[l];
if (a[l]<0) ta[id].zmax = a[l],ta[id].zmin = INF;
else ta[id].zmax = -INF,ta[id].zmin = a[l];
return;
}
ta[id].l = l;
ta[id].r = r;
int mid = (l+r)/2;
int lid = id*2,rid = id*2+1;
build1(lid,l,mid);
build1(rid,mid+1,r);
ta[id].maxsum = max(ta[lid].maxsum,ta[rid].maxsum);
ta[id].minsum = min(ta[lid].minsum,ta[rid].minsum);
ta[id].zmax = max(ta[lid].zmax,ta[rid].zmax);
ta[id].zmin = min(ta[lid].zmin,ta[rid].zmin);
}
void build2(int id,int l,int r)
{
if (l==r)
{
tb[id].l = l;
tb[id].r = r;
tb[id].maxsum = b[l];
tb[id].minsum = b[l];
return;
}
tb[id].l = l;
tb[id].r = r;
int mid = (l+r)/2;
int lid = id*2,rid = id*2+1;
build2(lid,l,mid);
build2(rid,mid+1,r);
tb[id].maxsum = max(tb[lid].maxsum,tb[rid].maxsum);
tb[id].minsum = min(tb[lid].minsum,tb[rid].minsum);
}
struct nodea
{
ll maxsum;
ll minsum;
ll zmax;
ll zmin;
};
nodea ask1(int id,int l,int r)
{
nodea x;
if (l<=ta[id].l and r>=ta[id].r)
{
x.maxsum = ta[id].maxsum;
x.minsum = ta[id].minsum;
x.zmax = ta[id].zmax;
x.zmin = ta[id].zmin;
return x;
}
int mid = (ta[id].l+ta[id].r)/2;
int lid = id*2,rid = id*2+1;
nodea v1;
nodea v2;
v1.maxsum = v2.maxsum = -INF;
v1.minsum = v2.minsum = INF;
v1.zmax = v2.zmax = -INF;
v1.zmin = v2.zmin = INF;
if (l<=mid) v1 = ask1(lid,l,mid);
if (r>mid) v2 = ask1(rid,mid+1,r);
x.maxsum = max(v1.maxsum,v2.maxsum);
x.minsum = min(v1.minsum,v2.minsum);
x.zmax = max(v1.zmax,v2.zmax);
x.zmin = min(v1.zmin,v2.zmin);
return x;
}
struct nodeb
{
ll maxsum;
ll minsum;
};
nodeb ask2(int id,int l,int r)
{
nodeb x;
if (l<=tb[id].l and r>=tb[id].r)
{
x.maxsum = tb[id].maxsum;
x.minsum = tb[id].minsum;
return x;
}
int mid = (tb[id].l+tb[id].r)/2;
int lid = id*2;
int rid = id*2+1;
nodeb v1,v2;
v1.maxsum = v2.maxsum = -INF;
v1.minsum = v2.minsum = INF;
if (l<=mid) v1 = ask2(lid,l,mid);
if (r>mid) v2 = ask2(rid,mid+1,r);
x.maxsum = max(v1.maxsum,v2.maxsum);
x.minsum = min(v1.minsum,v2.minsum);
return x;
}
int main()
{
cin>>n>>m>>q;
for (int i=1;i<=n;i++)
{
cin>>a[i];
}
build1(1,1,n);
for (int i=1;i<=m;i++)
{
cin>>b[i];
}
build2(1,1,m);
for (int i=1;i<=q;i++)
{
int l1,r1,l2,r2;
cin>>l1>>r1>>l2>>r2;
nodea aa;
nodeb bb;
aa = ask1(1,l1,r1);
bb = ask2(1,l2,r2);
int ans1=-INF,ans2=-INF;
if (aa.zmin<INF)
{
ans1 = max(aa.maxsum*bb.minsum,aa.zmin*bb.minsum);
}
if (aa.zmax>-INF)
{
ans2 = max(aa.minsum*bb.maxsum,aa.zmax*bb.maxsum);
}
cout<<max(ans1,ans2)<<endl;
}
}