rt.
代码如下:
#include <bits/stdc++.h>
#define int long long
using namespace std;
inline
int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' or ch > '9') {
if (ch == '-') f = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 1) + (x << 3) + (ch ^ '0');
ch = getchar();
}
return x * f;
}
const int N = 1e5 + 7;
int n, m, q, a[N], b[N], ans, tmp;
int log_2[N], st_max_b[N][27], st_min_b[N][27], st_max_a_fu[N][27], st_max_a_zheng[N][27], st_min_a_fu[N][27], st_min_a_zheng[N][27];
inline
int query_max_b(int l, int r) {
int k = log_2[r - l + 1];
return max(st_max_b[l][k], st_max_b[r - (1 << k) + 1][k]);
}
inline
int query_min_b(int l, int r) {
int k = log_2[r - l + 1];
return min(st_min_b[l][k], st_min_b[r - (1 << k) + 1][k]);
}
inline
int query_max_a_fu(int l, int r) {
int k = log_2[r - l + 1];
return max(st_max_a_fu[l][k], st_max_a_fu[r - (1 << k) + 1][k]);
}
inline
int query_min_a_fu(int l, int r) {
int k = log_2[r - l + 1];
return min(st_min_a_fu[l][k], st_min_a_fu[r - (1 << k) + 1][k]);
}
inline
int query_max_a_zheng(int l, int r) {
int k = log_2[r - l + 1];
return max(st_max_a_zheng[l][k], st_max_a_zheng[r - (1 << k) + 1][k]);
}
inline
int query_min_a_zheng(int l, int r) {
int k = log_2[r - l + 1];
return min(st_min_a_zheng[l][k], st_min_a_zheng[r - (1 << k) + 1][k]);
}
signed main() {
// freopen("game3.in", "r", stdin);
// freopen("game.out", "w", stdout);
n = read(), m = read(), q = read();
for (int i = 1; i <= n; i++) a[i] = read();
for (int i = 1; i <= m; i++) b[i] = read();
for (int i = 2; i <= max(n, m); i++) log_2[i] = log_2[i >> 1] + 1;
for (int i = 1; i <= m; i++) {
st_max_b[i][0] = b[i];
st_min_b[i][0] = b[i];
}
for (int i = 1; i <= n; i++) {
if (a[i] < 0) {
st_max_a_zheng[i][0] = -1e9;
st_min_a_zheng[i][0] = 1e9;
st_max_a_fu[i][0] = a[i];
st_min_a_fu[i][0] = a[i];
} else {
st_max_a_fu[i][0] = -1e9;
st_min_a_fu[i][0] = 1e9;
st_max_a_zheng[i][0] = a[i];
st_min_a_zheng[i][0] = a[i];
}
}
for (int j = 1; (1 << j) <= n; j++) {
for (int i = 1; i <= n - (1 << j) + 1; i++) {
st_max_a_fu[i][j] = max(st_max_a_fu[i][j - 1], st_max_a_fu[i + (1 << j - 1)][j - 1]);
st_min_a_fu[i][j] = min(st_min_a_fu[i][j - 1], st_min_a_fu[i + (1 << j - 1)][j - 1]);
st_max_a_zheng[i][j] = max(st_max_a_zheng[i][j - 1], st_max_a_zheng[i + (1 << j - 1)][j - 1]);
st_min_a_zheng[i][j] = min(st_min_a_zheng[i][j - 1], st_min_a_zheng[i + (1 << j - 1)][j - 1]);
}
}
for (int j = 1; (1 << j) <= m; j++) {
for (int i = 1; i <= m - (1 << j) + 1; i++) {
st_max_b[i][j] = max(st_max_b[i][j - 1], st_max_b[i + (1 << j - 1)][j - 1]);
st_min_b[i][j] = min(st_min_b[i][j - 1], st_min_b[i + (1 << j - 1)][j - 1]);
}
}
for (int l1, r1, l2, r2; q--; ) {
l1 = read(), r1 = read(), l2 = read(), r2 = read();
ans = -1e18, tmp = query_min_b(l2, r2);
if (tmp >= 0) {
ans = max(ans, tmp * query_max_a_zheng(l1, r1));
} else {
ans = max(ans, tmp * query_min_a_zheng(l1, r1));
}
tmp = query_max_b(l2, r2);
if (tmp >= 0) {
ans = max(ans, tmp * query_max_a_fu(l1, r1));
} else {
ans = max(ans, tmp * query_min_a_fu(l1, r1));
}
// for (int i = l1; i <= r1; i++) {
// if (!a[i]) ans = max(ans, 0ll);
// else if (a[i] > 0) {
// tmp = query_min(l2, r2);
// ans = max(ans, a[i] * tmp);
// } else if (a[i] < 0) {
// tmp = query_max(l2, r2);
// ans = max(ans, a[i] * tmp);
// }
// }
printf ("%lld\n", ans);
}
return 0;
}
//6 4 5
//3 -1 -2 1 2 0
//1 2 -1 -3
//
//1 6 1 4
//
//1 5 1 4
//
//-3 * 1
//2 * -1
//
//1 4 1 2
//2 6 3 4
//2 5 2 3
只要条对一定会关的qwq。