https://www.luogu.com.cn/record/124829413
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5,LOGN = 25;
int Log2[LOGN + 9];
int n,m,q;
int a[N + 9],b[N + 9];
int l1,r1,l2,r2;
int ST1[N + 9][LOGN + 9],ST2[N + 9][LOGN + 9];
int ST3[N + 9][LOGN + 9],ST4[N + 9][LOGN + 9];
int ST5[N + 9][LOGN + 9],ST6[N + 9][LOGN + 9];
void init_log2(){
for(int i = 2;i <= max(n,m);i++)
Log2[i] = Log2[i >> 1] + 1;
}
void init_ST_a(){
for(int i = 1;i <= n;i++)
ST1[i][0] = ST2[i][0] = a[i];
for (int j = 1; j <= Log2[n];j++){
for (int i = 1; i + (1 << j) - 1 <= n; i++) {
int r = i + (1 << (j - 1));
ST1[i][j] = max(ST1[i][j - 1], ST1[r][j - 1]);
ST2[i][j] = min(ST2[i][j - 1], ST2[r][j - 1]);
}
}
}
void init_ST_b(){
for(int i = 1;i <= m;i++)
ST3[i][0] = ST4[i][0] = b[i];
for (int j = 1; j <= Log2[m];j++){
for (int i = 1; i + (1 << j) - 1 <= m; i++) {
int r = i + (1 << (j - 1));
ST3[i][j] = max(ST3[i][j - 1], ST3[r][j - 1]);
ST4[i][j] = min(ST4[i][j - 1], ST4[r][j - 1]);
}
}
}
void init_ST_Z(){
for(int i = 1;i <= n;i++){
ST5[i][0] = a[i] < 0 ? a[i] : LLONG_MIN;
ST6[i][0] = a[i] >= 0 ? a[i] : LLONG_MAX;
}
for (int j = 1; j <= Log2[n];j++){
for (int i = 1; i + (1 << j) - 1 <= n; i++) {
int r = i + (1 << (j - 1));
ST5[i][j] = max(ST5[i][j - 1], ST5[r][j - 1]);
ST6[i][j] = min(ST6[i][j - 1], ST6[r][j - 1]);
}
}
}
void init(){
init_log2();
init_ST_a();
init_ST_b();
init_ST_Z();
}
int len(int l,int r){
return r - l + 1;
}
int solution(){
int len1 = len(l1,r1),len2 = len(l2,r2);
int L1 = Log2[len1],L2 = Log2[len2];
int pos1 = r1 - (1 << L1) + 1, pos2 = r2 - (1 << L2) + 1;
int ret;
int a_max = max(ST1[l1][L1], ST1[pos1][L1]);
int a_min = min(ST2[l1][L1], ST2[pos1][L1]);
int b_max = max(ST3[l2][L2], ST3[pos2][L2]);
int b_min = min(ST4[l2][L2], ST4[pos2][L2]);
int a_Z_max = max(ST5[l1][L1], ST5[pos1][L1]);
int a_Z_min = min(ST6[l1][L1], ST6[pos1][L1]);
int ans1 = a_max * (a_max >= 0 ? b_min : b_max);
int ans2 = a_min * (a_min >= 0 ? b_min : b_max);
if (a_Z_max != LLONG_MIN)
ans1 = max(ans1,a_Z_max * (a_Z_max >= 0 ? b_min : b_max));
if (a_Z_min != LLONG_MAX)
ans2 = max(ans2,a_Z_min * (a_Z_min >= 0 ? b_min : b_max));
ret = max(ans1,ans2);
return ret;
}
signed main(){
scanf("%lld%lld%lld", &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]);
init();
for(;q;q--){
scanf("%lld%lld%lld%lld", &l1, &r1 ,&l2, &r2);
printf("%lld\n", solution());
}
return 0;
}