test link
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100010;
const ll INF = LLONG_MAX, FINF = LLONG_MIN;
int n, m, q;
ll a, b, st[10][N][20], lg[N];
int l1, l2, r1, r2;
int main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m >> q;
memset(st, 0x3f, sizeof(st));
for (int i = 1; i <= n; i++) {
cin >> a;
st[1][i][0] = st[2][i][0] = a;
if (a < 0) {
st[3][i][0] = a;
st[4][i][0] = INF;
} else {
st[3][i][0] = FINF;
st[4][i][0] = a;
}
}
for (int i = 1; i <= m; i++) {
cin >> b;
st[5][i][0] = st[6][i][0] = b;
}
for (int i = 2; i <= max(n, m); i++)
lg[i] = lg[i >> 1] + 1;
for (int i = 1; i < 18; i++) {
for (int j = 1; j + (1 << i) - 1 <= n; j++) {
int p = j + (1 << (i - 1));
st[1][j][i] = max(st[1][j][i - 1], st[1][p][i - 1]);
st[2][j][i] = min(st[2][j][i - 1], st[2][p][i - 1]);
st[3][j][i] = max(st[3][j][i - 1], st[3][p][i - 1]);
st[4][j][i] = min(st[4][j][i - 1], st[4][p][i - 1]);
}
for (int j = 1; j + (1 << i) - 1 <= m; j++) {
int p = j + (1 << (i - 1));
st[5][j][i] = max(st[5][j][i - 1], st[5][p][i - 1]);
st[6][j][i] = min(st[6][j][i - 1], st[6][p][i - 1]);
}
}
while (q--) {
cin >> l1 >> r1 >> l2 >> r2;
int sa = lg[r1 - l1 + 1], sb = lg[r2 - l2 + 1];
int pa = r1 - (1 << sa) + 1, pb = r2 - (1 << sb) + 1;
ll amax = max(st[1][l1][sa], st[1][pa][sa]);
ll amin = min(st[2][l1][sa], st[1][pa][sa]);
ll afmx = max(st[3][l1][sa], st[3][pa][sa]);
ll azmn = min(st[4][l1][sa], st[4][pa][sa]);
ll bmax = max(st[5][l2][sb], st[5][pb][sb]);
ll bmin = min(st[6][l2][sb], st[6][pb][sb]);
ll ans = FINF;
if (amax < 0)ans = bmax * (bmax < 0 ? amin : amax);
else if (amin >= 0) ans = bmin * (bmin >= 0 ? amax : amin);
else if (bmax < 0) ans = amin * bmax;
else if (bmin >= 0) ans = amax * bmin;
else ans = max(azmn * bmin, afmx * bmax);
cout << ans << "\n";
}
return 0;
}