rt
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10, inf = 2e9;
struct node
{
int l, r, maxn, minn;
}ST[6][N << 2];
int a[N], b[N], n, m, q;
void push_up(int id, int ind)
{
ST[id][ind].maxn = max(ST[id][ind << 1].maxn, ST[id][ind << 1 | 1].maxn);
ST[id][ind].minn = min(ST[id][ind << 1].minn, ST[id][ind << 1 | 1].minn);
}
void build(int op, int ind, int l, int r)
{
if(op == 1)
{
ST[0][ind].l = ST[1][ind].l = ST[2][ind].l = l;
ST[0][ind].r = ST[1][ind].r = ST[2][ind].r = r;
}
else
{
ST[3][ind].l = ST[4][ind].l = ST[5][ind].l = l;
ST[3][ind].r = ST[4][ind].r = ST[5][ind].r = r;
}
if(l == r)
{
if(op == 1)
{
if(a[l] >= 0)
{
ST[0][ind].maxn = ST[0][ind].minn = a[l];
ST[1][ind].maxn = ST[1][ind].minn = inf;
}
else
{
ST[1][ind].maxn = ST[1][ind].minn = a[l];
ST[0][ind].maxn = ST[0][ind].minn = -inf;
}
ST[2][ind].maxn = ST[2][ind].minn = a[l];
}
else
{
if(b[l] >= 0)
{
ST[3][ind].maxn = ST[3][ind].minn = b[l];
ST[4][ind].maxn = ST[4][ind].minn = inf;
}
else
{
ST[4][ind].maxn = ST[4][ind].minn = b[l];
ST[3][ind].maxn = ST[3][ind].minn = -inf;
}
ST[5][ind].maxn = ST[5][ind].minn = a[l];
}
return;
}
int mid = (l + r) >> 1;
build(op, ind << 1, l, mid);
build(op, ind << 1 | 1, mid + 1, r);
if(op == 1)
push_up(0, ind), push_up(1, ind), push_up(2, ind);
else
push_up(3, ind), push_up(4, ind), push_up(5, ind);
}
int ask1(int id, int ind, int tl, int tr)
{
if(tl <= ST[id][ind].l && ST[id][ind].r <= tr)
return ST[id][ind].maxn;
int mid = (ST[id][ind].l + ST[id][ind].r) >> 1, res = -2e9;
if(tl <= mid)
res = max(res, ask1(id, ind << 1, tl, tr));
if(tr > mid)
res = max(res, ask1(id, ind << 1 | 1, tl, tr));
return res;
}
int ask2(int id, int ind, int tl, int tr)
{
if(tl <= ST[id][ind].l && ST[id][ind].r <= tr)
return ST[id][ind].minn;
int mid = (ST[id][ind].l + ST[id][ind].r) >> 1, res = 2e9;
if(tl <= mid)
res = min(res, ask2(id, ind << 1, tl, tr));
if(tr > mid)
res = min(res, ask2(id, ind << 1 | 1, tl, tr));
return res;
}
int main()
{
cin >> n >> m >> q;
for(int i = 1;i <= n;++i)
scanf("%d", &a[i]);
for(int i = 1;i <= m;++i)
scanf("%d", &b[i]);
build(1, 1, 1, n);
build(2, 1, 1, m);
int l1, r1, l2, r2;
while(q--)
{
scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
ll azmax = ask1(0, 1, l1, r1), afmax = ask1(1, 1, l1, r1), amax = ask1(2, 1, l1, r1);
ll azmin = ask2(0, 1, l1, r1), afmin = ask2(1, 1, l1, r1), amin = ask2(2, 1, l1, r1);
ll bzmax = ask1(3, 1, l2, r2), bfmax = ask1(4, 1, l2, r2), bmax = ask1(5, 1, l2, r2);
ll bzmin = ask2(3, 1, l2, r2), bfmin = ask2(4, 1, l2, r2), bmin = ask2(5, 1, l2, r2);
ll ans = -1e18;
if(abs(azmin) != inf && abs(bfmin) != inf)
ans = max(ans, azmin * bfmin);
if(abs(afmax) != inf && abs(bzmax) != inf)
ans = max(ans, afmax * bzmax);
if(bmin >= 0 && abs(azmax) != inf)
ans = max(ans, bmin * azmax);
else if(bmin < 0 && abs(afmin) != inf)
ans = max(ans, bmin * afmin);
if(bmax >= 0 && abs(azmax) != inf)
ans = max(ans, bmax * azmax);
else if(bmax < 0 && abs(afmin) != inf)
ans = max(ans, bmax * afmin);
cout << ans << "\n";
}
return 0;
}