rt
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10, inf = 2e9;
struct node
{
int l, r, maxv, minv, maxz, minz, maxf, minf;
}ST[2][N << 2];
int a[N], n, m, q;
void push_up(int id, int ind)
{
ST[id][ind].maxv = max(ST[id][ind << 1].maxv, ST[id][ind << 1 | 1].maxv);
ST[id][ind].minv = min(ST[id][ind << 1].minv, ST[id][ind << 1 | 1].minv);
ST[id][ind].maxz = max(ST[id][ind << 1].maxz, ST[id][ind << 1 | 1].maxz);
ST[id][ind].minz = min(ST[id][ind << 1].minz, ST[id][ind << 1 | 1].minz);
ST[id][ind].maxf = max(ST[id][ind << 1].maxf, ST[id][ind << 1 | 1].maxf);
ST[id][ind].minf = min(ST[id][ind << 1].minf, ST[id][ind << 1 | 1].minf);
}
void build(int id, int ind, int l, int r)
{
ST[id][ind].l = l;
ST[id][ind].r = r;
if(l == r)
{
ST[id][ind].maxv = ST[id][ind].minv = a[l];
ST[id][ind].maxz = ST[id][ind].maxf = -inf;
ST[id][ind].minz = ST[id][ind].minf = inf;
if(a[l] > 0)
ST[id][ind].minz = ST[id][ind].maxz = a[l];
else
ST[id][ind].minf = ST[id][ind].maxf = a[l];
return;
}
int mid = (l + r) >> 1;
build(id, ind << 1, l, mid);
build(id, ind << 1 | 1, mid + 1, r);
push_up(id, ind);
}
int val(int id, int ind, int typ)
{
if(typ == 1)
return ST[id][ind].maxv;
else if(typ == 2)
return ST[id][ind].minv;
else if(typ == 3)
return ST[id][ind].maxz;
else if(typ == 4)
return ST[id][ind].minz;
else if(typ == 5)
return ST[id][ind].maxf;
return ST[id][ind].minf;
}
int askMax(int id, int ind, int tl, int tr, int op)
{
if(tl <= ST[id][ind].l && ST[id][ind].r <= tr)
return val(id, ind, op);
int mid = (ST[id][ind].l + ST[id][ind].r) >> 1, res = -inf;
if(tl <= mid)
res = max(res, askMax(id, ind << 1, tl, tr, op));
if(tr > mid)
res = max(res, askMax(id, ind << 1 | 1, tl, tr, op));
return res;
}
int askMin(int id, int ind, int tl, int tr, int op)
{
if(tl <= ST[id][ind].l && ST[id][ind].r <= tr)
return val(id, ind, op);
int mid = (ST[id][ind].l + ST[id][ind].r) >> 1, res = inf;
if(tl <= mid)
res = min(res, askMin(id, ind << 1, tl, tr, op));
if(tr > mid)
res = min(res, askMin(id, ind << 1 | 1, tl, tr, op));
return res;
}
int main()
{
cin >> n >> m >> q;
for(int i = 1;i <= n;++i)
scanf("%d", &a[i]);
build(0, 1, 1, n);
for(int i = 1;i <= m;++i)
scanf("%d", &a[i]);
build(1, 1, 1, m);
int l1, r1, l2, r2;
while(q--)
{
scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
ll ans = -1e18;
ll amaxv = askMax(0, 1, l1, r1, 1), aminv = askMin(0, 1, l1, r2, 2);
ll bminv = askMin(1, 1, l2, r2, 2), bmaxv = askMax(1, 1, l2, r2, 1);
if(bminv >= 0 && abs(bminv) != inf)
{
if(amaxv >= 0 && abs(amaxv) != inf)
ans = max(ans, amaxv * bminv);
}
if(bmaxv <= 0 && abs(bmaxv) != inf)
{
if(aminv < 0 && abs(aminv) != inf)
ans = max(ans, aminv * bmaxv);
}
if(bminv <= 0 && bmaxv >= 0 && abs(bminv) != inf && abs(bmaxv) != inf)
{
ll aminz = askMin(0, 1, l1, r1, 4), amaxf = askMax(0, 1, l1, r1, 5);
ll bminf = askMin(1, 1, l2, r2, 6), bmaxz = askMax(1, 1, l2, r2, 3);
if(abs(aminz) != inf && abs(bminf) != inf)
ans = max(ans, aminz * bminf);
if(abs(amaxf) != inf && abs(bmaxz) != inf)
ans = max(ans, amaxf * bmaxz);
}
cout << ans << "\n";
}
return 0;
}