#include <bits/stdc++.h>
#define FstIO ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pb push_back
#define mem(a, v) memset(a, v, sizeof a)
#define pii pair<ll, ll>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
const ll N = 2e5 + 5, M = 5e2 + 5;
const ll mod = 1e9 + 7, mod2 = 998244353;
const ld eps = 1e-6;
ll n, m, q;
ll A[N], B[N];
ll fA[N], fB[N];
struct node
{
ll l, r;
ll Mx, Mn;
} ta[N << 2], tb[N << 2], ta2[N << 2];
#define ls (k << 1)
#define rs (k << 1 | 1)
void pushupA(ll k)
{
ta[k].Mx = max(ta[ls].Mx, ta[rs].Mx);
ta[k].Mn = min(ta[ls].Mn, ta[rs].Mn);
ta2[k].Mx = max(ta2[ls].Mx, ta2[rs].Mx);
ta2[k].Mn = min(ta2[ls].Mn, ta2[rs].Mn);
}
void buildA(ll k, ll l, ll r)
{
ta[k] = {l, r, 0, 0}; ta2[k] = {l, r, 0, 0};
if (l == r)
{
ll c = 1e10;
ta[k] = {l, r, A[l], A[l]};
if (A[l] >= 0) ta2[k] = {l, r, -c, A[l]};
else ta2[k] = {l, r, A[l], c};
return ;
}
ll mid = (l + r) >> 1;
buildA(k << 1, l, mid),
buildA(k << 1 | 1, mid + 1, r);
pushupA(k);
}
void pushupB(ll k)
{
tb[k].Mx = max(tb[ls].Mx, tb[rs].Mx);
tb[k].Mn = min(tb[ls].Mn, tb[rs].Mn);
}
void buildB(ll k, ll l, ll r)
{
tb[k] = {l, r, 0, 0};
if (l == r)
{
tb[k] = {l, r, B[l], B[l]};
return ;
}
ll mid = (l + r) >> 1;
buildB(k << 1, l, mid),
buildB(k << 1 | 1, mid + 1, r);
pushupB(k);
}
ll QmxA(ll k, ll l, ll r, ll ql, ll qr)
{
if (ql <= l && r <= qr) return ta[k].Mx;
ll mid = (l + r) >> 1, s = -1e11;
if (ql <= mid) s = max(s, QmxA(ls, l, mid, ql, qr));
if (qr > mid) s = max(s, QmxA(rs, mid + 1, r, ql, qr));
return s;
}
ll QmnA(ll k, ll l, ll r, ll ql, ll qr)
{
if (ql <= l && r <= qr) return ta[k].Mn;
ll mid = (l + r) >> 1, s = 1e11;
if (ql <= mid) s = min(s, QmnA(ls, l, mid, ql, qr));
if (qr > mid) s = min(s, QmnA(rs, mid + 1, r, ql, qr));
return s;
}
ll QmxB(ll k, ll l, ll r, ll ql, ll qr)
{
if (ql <= l && r <= qr) return tb[k].Mx;
ll mid = (l + r) >> 1, s = -1e11;
if (ql <= mid) s = max(s, QmxB(ls, l, mid, ql, qr));
if (qr > mid) s = max(s, QmxB(rs, mid + 1, r, ql, qr));
return s;
}
ll QmnB(ll k, ll l, ll r, ll ql, ll qr)
{
if (ql <= l && r <= qr) return tb[k].Mn;
ll mid = (l + r) >> 1, s = 1e11;
if (ql <= mid) s = min(s, QmnB(ls, l, mid, ql, qr));
if (qr > mid) s = min(s, QmnB(rs, mid + 1, r, ql, qr));
return s;
}
ll Qmx_nega(ll k, ll l, ll r, ll ql, ll qr)
{
if (ql <= l && r <= qr) return ta2[k].Mx;
ll mid = (l + r) >> 1, s = -1e11;
if (ql <= mid) s = max(s, Qmx_nega(ls, l, mid, ql, qr));
if (qr > mid) s = max(s, Qmx_nega(rs, mid + 1, r, ql, qr));
return s;
}
ll Qmn_pos(ll k, ll l, ll r, ll ql, ll qr)
{
if (ql <= l && r <= qr) return ta2[k].Mn;
ll mid = (l + r) >> 1, s = 1e11;
if (ql <= mid) s = min(s, Qmn_pos(ls, l, mid, ql, qr));
if (qr > mid) s = min(s, Qmn_pos(rs, mid + 1, r, ql, qr));
return s;
}
signed main()
{
FstIO;
cin >> n >> m >> q;
for (ll i = 1; i <= n; ++ i ) cin >> A[i];
for (ll i = 1; i <= m; ++ i ) cin >> B[i];
for (ll i = 1; i <= n; ++ i ) fA[i] = fA[i - 1] + (!A[i]);
for (ll i = 1; i <= m; ++ i ) fB[i] = fB[i - 1] + (!B[i]);
buildA(1, 1, n);
buildB(1, 1, m);
while (q -- )
{
ll l1, r1, l2, r2;
cin >> l1 >> r1 >> l2 >> r2;
ll ca = fA[r1] - fA[l1 - 1];
ll cb = fB[r2] - fB[l2 - 1];
ll p = QmnA(1, 1, n, l1, r1), Answer;
if (p > 0)
{
ll k = QmnB(1, 1, m, l2, r2);
if (k > 0)
Answer = QmxA(1, 1, n, l1, r1) * QmnB(1, 1, m, l2, r2);
else
Answer = QmnA(1, 1, n, l1, r1) * QmnB(1, 1, m, l2, r2);
if (ca > 0) Answer = max(Answer, 0ll);
if (cb > 0) Answer = min(Answer, 0ll);
cout << Answer << '\n'; continue;
}
p = QmxA(1, 1, n, l1, r1);
if (p < 0)
{
ll k = QmxB(1, 1, m, l2, r2);
if (k < 0)
Answer = QmnA(1, 1, n, l1, r1) * QmxB(1, 1, m, l2, r2);
else
Answer = QmxA(1, 1, n, l1, r1) * QmxB(1, 1, m, l2, r2);
if (ca > 0) Answer = max(Answer, 0ll);
if (cb > 0) Answer = min(Answer, 0ll);
cout << Answer << '\n'; continue;
}
ll k = QmxB(1, 1, m, l2, r2);
if (k < 0)
Answer = QmnA(1, 1, n, l1, r1) * QmxB(1, 1, m, l2, r2);
else
{
k = QmnB(1, 1, n, l2, r2);
if (k > 0)
Answer = QmxA(1, 1, n, l1, r1) * QmnB(1, 1, m, l2, r2);
else
{
Answer = max(Qmx_nega(1, 1, n, l1, r1) * QmxB(1, 1, m, l2, r2),
Qmn_pos(1, 1, n, l1, r1) * QmnB(1, 1, m, l2, r2));
}
}
if (ca > 0) Answer = max(Answer, 0ll);
if (cb > 0) Answer = min(Answer, 0ll);
cout << Answer << '\n';
}
return 0;
cout.flush();
}