#include <bits/stdc++.h>
const int N = 1e5 + 5;
const long long inf = 1e18;
struct Node
{
long long Max;
long long Min;
long long _Min;
long long _Max;
}node[2][N << 2];
long long a[2][N];
void pushup(Node & u, Node & lson, Node & rson)
{
u.Max = std::max(lson.Max, rson.Max);
u.Min = std::min(lson.Min, rson.Min);
u._Min = std::min(lson._Min, rson._Min);
u._Max = std::max(lson._Max, rson._Max);
}
void merge(Node & u, Node v)
{
u.Max = std::max(u.Max, v.Max);
u.Min = std::min(u.Min, v.Min);
u._Min = std::min(u._Min, v._Min);
u._Max = std::max(u._Max, v._Max);
}
void build(int f, int i, int l, int r)
{
if (l == r)
{
node[f][i].Max = node[f][i].Min = a[f][l];
node[f][i]._Max = -inf;
node[f][i]._Min = inf;
if (a[f][l] >= 0) node[f][i]._Min = std::min(node[f][i]._Min, a[f][l]);
if (a[f][l] <= 0) node[f][i]._Max = std::max(node[f][i]._Max, a[f][l]);
return;
}
int mid = (l + r) >> 1;
build(f, i << 1, l, mid);
build(f, i << 1 | 1, mid + 1, r);
pushup(node[f][i], node[f][i << 1], node[f][i << 1 | 1]);
}
Node query(int f, int i, int l, int r, int L, int R)
{
if (l >= L && r <= R) return node[f][i];
int mid = (l + r) >> 1;
Node ans;
ans.Max = ans._Max = -inf;
ans.Min = ans._Min = inf;
if (L <= mid) merge(ans, query(f, i << 1, l, mid, L, R));
if (R > mid) merge(ans, query(f, i << 1 | 1, mid + 1, r, L, R));
return ans;
}
int main ()
{
int n, m, q;
std::cin >> n >> m >> q;
for (int i = 1; i <= n; i++) std::cin >> a[0][i];
for (int i = 1; i <= m; i++) std::cin >> a[1][i];
build(0, 1, 1, n);
build(1, 1, 1, m);
while (q--)
{
int A, B, C, D;
std::cin >> A >> B >> C >> D;
Node t1 = query(0, 1, 1, n, A, B);
Node t2 = query(1, 1, 1, m, C, D);
long long ans = -2e18;
if (t2.Min >= 0)
{
ans = std::max(ans, t1.Max * t2.Min);
}
else if (t2.Min < 0 && t2.Max >= 0)
{
if (t1._Min != inf) ans = std::max(ans, t1._Min * t2.Min);
if (t1._Max != -inf) ans = std::max(ans, t1._Max * t2.Max);
}
else
{
if (t1.Min <= 0) ans = std::max(ans, t1.Min * t2.Max);
else ans = std::max(ans, t1.Min * t2.Min);
}
std::cout << ans << "\n";
}
return 0;
}