#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
const int RE = 0x3f3f3f3f;
int n, a[maxn], p[10][maxn][20];
int m, b[maxn], p1[maxn][20], p2[maxn][20];
int q, l1, r1, l2, r2;
inline void init() {
scanf("%d %d %d", &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]);
memset(p[0], -0x3f, sizeof p[0]);
memset(p[1], 0x3f, sizeof p[1]);
memset(p[2], -0x3f, sizeof p[2]);
memset(p[3], 0x3f, sizeof p[3]);
return ;
}
inline void getST1() {
for (int i = 1; i <= n; i++)
if (a[i] >= 0) p[0][i][0] = p[1][i][0] = a[i];
else p[2][i][0] = p[3][i][0] = a[i];
for (int j = 1; (1 << j) <= n; j++)
for (int i = 1; i + (1 << j - 1) <= n; i++) {
p[0][i][j] = max(p[0][i][j - 1], p[0][i + (1 << j - 1)][j - 1]);
p[1][i][j] = min(p[1][i][j - 1], p[1][i + (1 << j - 1)][j - 1]);
p[2][i][j] = max(p[2][i][j - 1], p[2][i + (1 << j - 1)][j - 1]);
p[3][i][j] = min(p[3][i][j - 1], p[3][i + (1 << j - 1)][j - 1]);
}
return ;
}
inline int query1(int l, int r, int ord) {
int t = log2(r - l + 1);
if (ord % 2) return min(p[ord][l][t], p[ord][r - (1 << t) + 1][t]);
return max(p[ord][l][t], p[ord][r - (1 << t) + 1][t]);
}
inline void getST2() {
for (int i = 1; i <= m; i++) p1[i][0] = p2[i][0] = b[i];
for (int j = 1; (1 << j) <= m; j++)
for (int i = 1; i + (1 << j - 1) <= m; i++) {
p1[i][j] = max(p1[i][j - 1], p1[i + (1 << j - 1)][j - 1]);
p2[i][j] = min(p2[i][j - 1], p2[i + (1 << j - 1)][j - 1]);
}
return ;
}
inline int query2(int l, int r, int ord) {
int t = log2(r - l + 1);
if (ord % 2) return max(p1[l][t], p1[r - (1 << t) + 1][t]);
return min(p2[l][t], p2[r - (1 << t) + 1][t]);
}
inline void solve() {
scanf("%d %d %d %d", &l1, &r1, &l2, &r2);
int bmax = query2(l2, r2, 1), bmin = query2(l1, r2, 2);
int t = 0;
long long ans = -RE;
t = query1(l1, r1, 0);
if (t != -RE) ans = max(ans, 1ll * min(t * bmax, t * bmin));
t = query1(l1, r1, 1);
if (t != RE) ans = max(ans, 1ll * min(t * bmax, t * bmin));
t = query1(l1, r1, 2);
if (t != -RE) ans = max(ans, 1ll * min(t * bmax, t * bmin));
t = query1(l1, r1, 3);
if (t != RE) ans = max(ans, 1ll * min(t * bmax, t * bmin));
printf("%lld\n", ans);
return ;
}
signed main() {
init();
getST1(), getST2();
while (q--) solve();
return 0;
}
目前可以确定是在 solve()
函数中出现的问题,请各位大佬帮忙看看 qwq。