rt:sub0 wa23 29 36 37 sub1 wa3 9 10 16 17
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
#define int long long
int a[maxn], b[maxn];
int n, m, q;
#define N 25
int dp[maxn][N], dp1[maxn][N], dp2[maxn][N], dp3[maxn][N], Log[maxn];
int spe_dp[maxn][N], spe_dp1[maxn][N];
signed main() {
// freopen("game3.in", "r", stdin);
// freopen("game3.out", "w", stdout);
cin >> n >> m >> q;
for (int i = 1; i <= n; i++) {
cin >> a[i];
dp[i][0] = a[i];
dp1[i][0] = a[i];
if (a[i] >= 0) spe_dp[i][0] = a[i];
else spe_dp[i][0] = 1e9;
if (a[i] <= 0) spe_dp1[i][0] = a[i];
else spe_dp1[i][0] = -1e9;
}
bool p = 0, imp = 0;
for (int i = 1; i <= m; i++) {
cin >> b[i];
dp2[i][0] = b[i];
dp3[i][0] = b[i];
}
Log[1] = 0;
for (int i = 2; i <= 1e5; i++) Log[i] = Log[i / 2] + 1;
for (int j = 1; j <= 17; j++) {
for (int i = 1; i + (1 << j - 1) <= n; i++) {
dp[i][j] = max(dp[i][j - 1], dp[i + (1 << j - 1)][j - 1]);
}
}
for (int j = 1; j <= 20; j++) {
for (int i = 1; i + (1 << j - 1) <= n; i++) {
if (i + (1 << j - 1) <= n) dp1[i][j] = min(dp1[i][j - 1], dp1[i + (1 << j - 1)][j - 1]);
}
}
for (int j = 1; j <= 20; j++) {
for (int i = 1; i + (1 << j - 1) <= m; i++) {
dp2[i][j] = max(dp2[i][j - 1], dp2[i + (1 << j - 1)][j - 1]);
}
}
for (int j = 1; j <= 20; j++) {
for (int i = 1; i + (1 << j - 1) <= m; i++) {
dp3[i][j] = min(dp3[i][j - 1], dp3[i + (1 << j - 1)][j - 1]);
}
}
for (int j = 1; j <= 20; j++) {
for (int i = 1; i + (1 << j - 1) <= n; i++) {
spe_dp[i][j] = min(spe_dp[i][j - 1], spe_dp[i + (1 << j - 1)][j - 1]);
}
}
for (int j = 1; j <= 20; j++) {
for (int i = 1; i + (1 << j - 1) <= n; i++) {
spe_dp1[i][j] = max(spe_dp1[i][j - 1], spe_dp1[i + (1 << j - 1)][j - 1]);
}
}
for (int i = 1; i <= q; i++) {
int l, r, l1, r1;
cin >> l >> r >> l1 >> r1;
int ans = 0;
int now = Log[r - l + 1], now1 = Log[r1 - l1 + 1];
int max_a = max(dp[l][now], dp[r - (1 << now) + 1][now]);
int min_b = min(dp3[l1][now1], dp3[r1 - (1 << now1) + 1][now1]);
int min_a = min(dp1[l][now], dp1[r - (1 << now) + 1][now]);
int max_b = max(dp2[l1][now1], dp2[r1 - (1 << now1) + 1][now1]);
int min_p_a = min(spe_dp[l][now], spe_dp[r - (1 << now) + 1][now]);
int max_imp_a = max(spe_dp1[l][now], spe_dp1[r - (1 << now) + 1][now]);
// cout << "max_a:"<< max_a << "|| max_b:" << max_b << endl << "min_a:" << min_a << "|| min_b" << min_b << endl;
// cout << "min_正数:"<< min_p_a << "|| max_负数:" << max_imp_a << endl;
if (min_b >= 0) {
if (max_a >= 0) cout << max_a * min_b << endl;
else cout << max_a * max_b << endl;
} else if (max_b <= 0) {
if (min_a <= 0) cout << min_a * max_b << endl;
else cout << min_a * min_b << endl;
} else {
int ans1 = -1e18, ans2 = -1e18;
if (min_p_a != 2e9) ans1 = min_p_a * min_b;
if (max_imp_a != -2e9) ans2 = max_imp_a * max_b;
cout << max(ans1, ans2) << endl;
}
}
}