4 个 ST 表打性质1、2, 全部WA
#include <bits/stdc++.h>
#define F(i, l, r) for(int i = l; i < r; ++i)
#define Fe(i, l, r) for(int i = l; i <= r; ++i)
#define Fer(i, l, r) for(int i = l; i >= r; --i)
#define reopen(A) { freopen(#A".in", "r", stdin); freopen(#A".out", "w", stdout); }
using namespace std;
typedef long long ll;
constexpr int N = 200005;
ll n, m, q;
ll a[N], b[N];
ll st[N][20], st2[N][20], st3[N][20], st4[N][20];
ll lg[N];
#define int long long
void init(){
lg[1] = 0;
for(int i = 2; i < N; i ++){
lg[i] = lg[i / 2] + 1;
}
for(int i = 1; i <= n; i ++){
st[i][0] = a[i];
}
for(int i = 1; i <= m; i ++){
st2[i][0] = b[i];
}
for(int i = 1; i <= m; i ++){
st4[i][0] = b[i];
}
for(int i = 1; i <= n; i ++){
st3[i][0] = a[i];
}
for(int i = 1; i <= lg[n]; i++){
for(int l = 1; l <= n; l ++){
st[l][i] = max(st[l][i - 1], st[l + (1 << (i - 1))][i - 1]);
}
}
for(int i = 1; i <= lg[m]; i++){
for(int l = 1; l <= m; l ++){
st4[l][i] = max(st4[l][i - 1], st4[l + (1 << (i - 1))][i - 1]);
}
}
for(int i = 1; i <= lg[m]; i++){
for(int l = 1; l <= m; l ++){
st2[l][i] = min(st2[l][i - 1], st2[l + (1 << (i - 1))][i - 1]);
}
}
for(int i = 1; i <= lg[n]; i++){
for(int l = 1; l <= n; l ++){
st3[l][i] = min(st3[l][i - 1], st3[l + (1 << (i - 1))][i - 1]);
}
}
}
ll c(int x, int y){
return a[x] * b[y];
}
ll querymx(int l1, int r1){
if(l1 == r1) return a[l1];
ll mx = max(st[l1][lg[r1 - l1 + 1]], st[r1 - ((lg[r1 - l1 + 1]) << 1) + 1][lg[r1 - l1 + 1]]);
return mx;
}
ll querymi(int l1, int r1){
if(l1 == r1) return b[l1];
ll mi = min(st2[l1][lg[r1 - l1 + 1]], st2[r1 - ((lg[r1 - l1 + 1]) << 1) + 1][lg[r1 - l1 + 1]]);
return mi;
}
ll querymx_b(int l1, int r1){
if(l1 == r1) return b[l1];
ll mx = max(st4[l1][lg[r1 - l1 + 1]], st4[r1 - ((lg[r1 - l1 + 1]) << 1) + 1][lg[r1 - l1 + 1]]);
return mx;
}
ll querymi_a(int l1, int r1){
if(l1 == r1) return a[l1];
ll mi = min(st3[l1][lg[r1 - l1 + 1]], st3[r1 - ((lg[r1 - l1 + 1]) << 1) + 1][lg[r1 - l1 + 1]]);
return mi;
}
ll query(int l1, int r1, int l2, int r2){
if(l1 == r1 && a[l1] < 0){
return querymx_b(l2, r2) * a[l1];
}
if(l2 == r2 && b[l2] < 0){
return querymi_a(l1, r1) * b[l2];
}
ll mi, mx;
mx = querymx(l1, r1);
mi = querymi(l2, r2);
return mi * mx;
}
signed main(){
ios::sync_with_stdio(); cin.tie(0);
cin>>n>>m>>q;
Fe(i, 1, n) cin>>a[i];
Fe(i, 1, m) cin>>b[i];
init();
while(q--){
int l1, r1, l2, r2;
cin>>l1>>r1>>l2>>r2;
cout<<query(l1, r1, l2, r2)<<'\n';
}
return 0;
}