rt,6 个 ST 表做法
#include<bits/stdc++.h>
#define ll long long
#define rll register ll
#define F(i,a,b) for(rll i=a;i<=b;i++)
#define Fdn(i,a,b) for(rll i=a;i>=b;i--)
using namespace std;
const int inf = 0x3f3f3f3f,mod = 1e9 + 7;
const int maxn = 1e5 + 7,logn = 18;
int amax[maxn][logn];
int amin[maxn][logn];
int amaxn[maxn][logn];
int aminp[maxn][logn];
int bmax[maxn][logn];
int bmin[maxn][logn];
int Logn[maxn];
int a[maxn],b[maxn];
int n,m,q;
int ans;
inline void Logn_Prework(){
Logn[0] = 0,Logn[1] = 0,Logn[2] = 1;
F(i,3,maxn)
Logn[i] = Logn[i / 2] + 1;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n >> m >> q;
F(i,1,n){
cin >> a[i];
amax[i][0] = amin[i][0] = a[i],
amaxn[i][0] = (a[i] < 0 ? a[i] : -INF),
aminp[i][0] = (a[i] >= 0 ? a[i] : INF);
}
F(i,1,m){
cin >> b[i];
bmax[i][0] = bmin[i][0] = b[i];
}
F(j,1,logn - 1)
F(i,1,n)
amax[i][j] = max(amax[i][j - 1],amax[i + (1 << (j - 1))][j - 1]),
amin[i][j] = min(amin[i][j - 1],amin[i + (1 << (j - 1))][j - 1]),
amaxn[i][j] = max(amaxn[i][j - 1],amaxn[i + (1 << (j - 1))][j - 1]),
aminp[i][j] = min(aminp[i][j - 1],aminp[i + (1 << (j - 1))][j - 1]);
F(j,1,logn - 1)
F(i,1,m)
bmax[i][j] = max(bmax[i][j - 1],bmax[i + (1 << (j - 1))][j - 1]),
bmin[i][j] = min(bmin[i][j - 1],bmin[i + (1 << (j - 1))][j - 1]);
while(q--){
ans = -INF;
int l,r,l2,r2;
cin >> l >> r >> l2 >> r2;
int s = Logn[(r - l + 1)],s2 = Logn[(r2 - l2 + 1)];
int amx,amn,amxn,amnp,bmx,bmn;
amx = max(amax[l][s],amax[r - (1 << s) + 1][s]),
amn = min(amin[l][s],amin[r - (1 << s) + 1][s]),
amxn = max(amaxn[l][s],amaxn[r - (1 << s) + 1][s]),
amnp = min(aminp[l][s],aminp[r - (1 << s) + 1][s]),
bmx = max(bmax[l2][s2],bmax[r2 - (1 << s2) + 1][s2]),
bmn = min(bmin[l2][s2],bmin[r2 - (1 << s2) + 1][s2]);
if(amx >= 0)
ans = max(ans,amx * bmn);
else
ans = max(ans,amx * bmx);
if(amn >= 0)
ans = max(ans,amn * bmn);
else
ans = max(ans,amn * bmx);
if(amxn != -INF){
if(amxn >= 0)
ans = max(ans,amxn * bmn);
else
ans = max(ans,amxn * bmx);
}
if(amnp != INF){
if(amnp >= 0)
ans = max(ans,amnp * bmn);
else
ans = max(ans,amnp * bmx);
}
cout << ans << endl;
}
return 0;
}