细分了九种情况:
#include <bits/stdc++.h>
#define int long long
#define N 100001
using namespace std;
int n,m,q,l,r,l2,r2;
int a[N],b[N];
int sta[N][31],stb[N][31],sta_[N][31],stb_[N][31];
int _sta[N][31],_sta_[N][31];
int Maxa(int l,int r){
int lg=log2(r-l+1);
return max(sta[l][lg],sta[r-(1<<lg)+1][lg]);
}
int Mina(int l,int r){
int lg=log2(r-l+1);
return min(sta_[l][lg],sta_[r-(1<<lg)+1][lg]);
}
int Maxb(int l,int r){
int lg=log2(r-l+1);
return max(stb[l][lg],stb[r-(1<<lg)+1][lg]);
}
int Minb(int l,int r){
int lg=log2(r-l+1);
return min(stb_[l][lg],stb_[r-(1<<lg)+1][lg]);
}
int mina(int l,int r){
int lg=log2(r-l+1);
return min(_sta[l][lg],_sta[r-(1<<lg)+1][lg]);
}
int maxa(int l,int r){
int lg=log2(r-l+1);
return max(_sta_[l][lg],_sta_[r-(1<<lg)+1][lg]);
}
signed main(){
cin>>n>>m>>q;
for (int i=1;i<=n;i++){
cin>>a[i];
sta[i][0]=sta_[i][0]=a[i];
_sta[i][0]=(a[i]>=0?a[i]:LONG_LONG_MAX);
_sta_[i][0]=(a[i]<0?a[i]:LONG_LONG_MIN);
}
for (int i=1;i<=m;i++){
cin>>b[i];
stb[i][0]=stb_[i][0]=b[i];
}
int lg=log2(n);
for (int j=1;j<=lg;j++){
for (int i=1;i+(1<<j)-1<=n;i++){
sta[i][j]=max(sta[i][j-1],sta[i+(1<<(j-1))][j-1]);
sta_[i][j]=min(sta_[i][j-1],sta_[i+(1<<(j-1))][j-1]);
_sta[i][j]=min(_sta[i][j-1],_sta[i+(1<<(j-1))][j-1]);
_sta_[i][j]=max(_sta_[i][j-1],_sta_[i+(1<<(j-1))][j-1]);
}
}
lg=log2(m);
for (int j=1;j<=lg;j++){
for (int i=1;i+(1<<j)-1<=m;i++){
stb[i][j]=max(stb[i][j-1],stb[i+(1<<(j-1))][j-1]);
stb_[i][j]=min(stb_[i][j-1],stb_[i+(1<<(j-1))][j-1]);
}
}
while (q--){
cin>>l>>r>>l2>>r2;
int mxa=Maxa(l,r);
int mna=Mina(l,r);
int mxb=Maxb(l2,r2);
int mnb=Minb(l2,r2);
int amna=mina(l,r);
int amxa=maxa(l,r);
if (mna>=0&&mnb>=0){//A B 全正
cout<<mxa*mnb<<endl;
}else if (mxa<0&&mnb<0){//A B 全负
cout<<mna*mxb<<endl;
}else if (mna>=0&&mxb>=0&&mnb<0){//A 全正 B 正负
cout<<mna*mnb<<endl;
}else if (mxa<0&&mxb>=0&&mnb<0){//A 全负 B 正负
cout<<mxa*mxb<<endl;
}else if (mxa>=0&&mna<0&&mnb>=0){//A 正负 B 全正
cout<<mxa*mnb<<endl;
}else if (mxa>=0&&mna<0&&mxb<0){//A 正负 B 全负
cout<<mna*mxb<<endl;
}else if (mna>=0&&mxb<0){//A 全正 B 全负
cout<<mna*mnb<<endl;
}else if (mxa<0&&mnb>=0){//A 全负 B 全正
cout<<mxa*mxb<<endl;
}else{//A 正负 B 正负
cout<<max(mina(l,r)*mnb,maxa(l,r)*mxb)<<endl;
}
}
return 0;
}
是不是哪里写炸了