我也没看出来,您要不要看看 AC 代码?
by NightTide @ 2022-11-05 15:56:06
```cpp
#include<bits/stdc++.h>
#define MAXN 100010
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
int n, m, q;
ll a[MAXN], b[MAXN], max1[2][MAXN][20], max2[2][MAXN][20], min1[2][MAXN][20], min2[2][MAXN][20];
void pre_work(int op, int n, ll arr[]){
for(int i = 1; i <= n; i++){
max1[op][i][0] = arr[i] >= 0 ? arr[i] : -1;
max2[op][i][0] = arr[i] < 0 ? arr[i] : -INF;
min1[op][i][0] = arr[i] >= 0 ? arr[i] : INF;
min2[op][i][0] = arr[i] < 0 ? arr[i] : 1;
}
for(int j = 1; j < 20; j++){
for(int i = 1; i + (1 << j) - 1 <= n; i++){
max1[op][i][j] = max(max1[op][i][j - 1], max1[op][i + (1 << (j - 1))][j - 1]);
max2[op][i][j] = max(max2[op][i][j - 1], max2[op][i + (1 << (j - 1))][j - 1]);
min1[op][i][j] = min(min1[op][i][j - 1], min1[op][i + (1 << (j - 1))][j - 1]);
min2[op][i][j] = min(min2[op][i][j - 1], min2[op][i + (1 << (j - 1))][j - 1]);
}
}
}
ll query(int op, int tp, int l, int r){
int lg = log2(r - l + 1); ll res;
if(tp == 1) res = max(max1[op][l][lg], max1[op][r - (1 << lg) + 1][lg]);
if(tp == 2) res = max(max2[op][l][lg], max2[op][r - (1 << lg) + 1][lg]);
if(tp == 3) res = min(min1[op][l][lg], min1[op][r - (1 << lg) + 1][lg]);
if(tp == 4) res = min(min2[op][l][lg], min2[op][r - (1 << lg) + 1][lg]);
return res;
}
int main(){
scanf("%d%d%d",&n,&m,&q);
for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
for(int i = 1; i <= m; i++) scanf("%lld", &b[i]);
pre_work(0, n, a); pre_work(1, m, b);
while(q--){
int l1, r1, l2, r2;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
ll a1 = query(0, 1, l1, r1), a2 = query(0, 2, l1, r1), a3 = query(0, 3, l1, r1), a4 = query(0, 4, l1, r1);
ll b1 = query(1, 1, l2, r2), b2 = query(1, 2, l2, r2), b3 = query(1, 3, l2, r2), b4 = query(1, 4, l2, r2);
ll res;
if(a4 == 1){
if(b4 == 1) res = a1 * b3;
else if(b1 == -1) res = a3 * b4;
else res = a3 * b4;
}else if(a1 == -1){
if(b4 == 1) res = a2 * b1;
else if(b1 == -1) res = a4 * b2;
else res = a2 * b1;
}else{
if(b4 == 1) res = a1 * b3;
else if(b1 == -1) res = a4 * b2;
else res = max(a3 * b4, a2 * b1);
}
printf("%lld\n",res);
}
return 0;
}
```
by NightTide @ 2022-11-05 15:56:23
`for (int i = 2; i <= max(n,m); i ++) lg[i] = lg[i >> 1] + 1;`
by MoonFlower @ 2022-11-05 16:31:05