rt。使用ST表。
#include<iostream>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
#define int long long
int n,m,q;
int a[100010],b[100010];
int mxza[100010][30],mxfa[100010][30],mnza[100010][30],mnfa[100010][30];
int mxzb[100010][30],mxfb[100010][30],mnzb[100010][30],mnfb[100010][30];
int maxza(int l,int r){
if(l==r){
if(a[l]>=0)return a[l];
return -1e18;
}
int k=log2(r-l+1);
return max(mxza[l][k],mxza[r-(1<<k)+1][k]);
}
int maxfa(int l,int r){
if(l==r){
if(a[l]<=0)return a[l];
return -1e18;
}
int k=log2(r-l+1);
return max(mxfa[l][k],mxfa[r-(1<<k)+1][k]);
}
int maxzb(int l,int r){
if(l==r){
if(a[l]>=0)return b[l];
return -1e18;
}
int k=log2(r-l+1);
return max(mxzb[l][k],mxzb[r-(1<<k)+1][k]);
}
int maxfb(int l,int r){
if(l==r){
if(a[l]<=0)return b[l];
return -1e18;
}
int k=log2(r-l+1);
return max(mxfb[l][k],mxfb[r-(1<<k)+1][k]);
}
int minza(int l,int r){
if(l==r){
if(a[l]>=0)return a[l];
return -1e18;
}
int k=log2(r-l+1);
return min(mnza[l][k],mnza[r-(1<<k)+1][k]);
}
int minfa(int l,int r){
if(l==r){
if(a[l]<=0)return a[l];
return -1e18;
}
int k=log2(r-l+1);
return min(mnfa[l][k],mnfa[r-(1<<k)+1][k]);
}
int minzb(int l,int r){
if(l==r){
if(a[l]>=0)return b[l];
return -1e18;
}
int k=log2(r-l+1);
return min(mnzb[l][k],mnzb[r-(1<<k)+1][k]);
}
int minfb(int l,int r){
if(l==r){
if(a[l]<=0)return b[l];
return -1e18;
}
int k=log2(r-l+1);
return min(mnfb[l][k],mnfb[r-(1<<k)+1][k]);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m>>q;
for(int i=1;i<=n;++i){
for(int j=0;j<=20;++j){
mxfa[i][j]=mxza[i][j]=-1e18;
mnfa[i][j]=mnza[i][j]=1e18;
}
}
for(int i=1;i<=m;++i){
for(int j=0;j<=20;++j){
mxfb[i][j]=mxzb[i][j]=-1e18;
mnfb[i][j]=mnzb[i][j]=1e18;
}
}
for(int i=1;i<=n;++i){
cin>>a[i];
if(a[i]>=0)mxza[i][0]=mnza[i][0]=a[i];
else mxfa[i][0]=mnfa[i][0]=a[i];
}
for(int i=1;i<=m;++i){
cin>>b[i];
if(b[i]>=0)mxzb[i][0]=mnzb[i][0]=b[i];
else mxfb[i][0]=mnfb[i][0]=b[i];
}
for(int j=1;j<=20;++j){
for(int i=1;i<=n;++i){
mxza[i][j]=max(mxza[i][j-1],mxza[min(n,i+(1<<(j-1)))][j-1]);
mxfa[i][j]=max(mxfa[i][j-1],mxfa[min(n,i+(1<<(j-1)))][j-1]);
mnza[i][j]=min(mnza[i][j-1],mnza[min(n,i+(1<<(j-1)))][j-1]);
mnfa[i][j]=min(mnfa[i][j-1],mnfa[min(n,i+(1<<(j-1)))][j-1]);
}
for(int i=1;i<=m;++i){
mxzb[i][j]=max(mxzb[i][j-1],mxzb[min(n,i+(1<<(j-1)))][j-1]);
mxfb[i][j]=max(mxfb[i][j-1],mxfb[min(n,i+(1<<(j-1)))][j-1]);
mnzb[i][j]=min(mnzb[i][j-1],mnzb[min(n,i+(1<<(j-1)))][j-1]);
mnfb[i][j]=min(mnfb[i][j-1],mnfb[min(n,i+(1<<(j-1)))][j-1]);
}
}
while(q--){
int l1,l2,r1,r2;
cin>>l1>>r1>>l2>>r2;
if(maxzb(l2,r2)==-1e18){//b只有负数
if(minfa(l1,r1)!=1e18){//a有负数
cout<<minfa(l1,r1)*maxfb(l2,r2)<<"\n";
}
else{//a没有负数
cout<<minza(l1,r1)*minfb(l2,r2)<<"\n";
}
}
else if(maxfb(l2,r2)==-1e18){//b只有正数
if(minza(l1,r1)!=1e18){//a有正数
cout<<maxza(l1,r1)*minzb(l2,r2)<<"\n";
}
else{//a没有正数
cout<<maxfa(l1,r1)*maxzb(l2,r2)<<"\n";
}
}
else{//b既有正数也有负数
vector<int>ans;
if(maxza(l1,r1)!=-1e18){
ans.push_back(minza(l1,r1)*minfb(l2,r2));
}
if(maxfa(l1,r1)!=-1e18){
ans.push_back(maxfa(l1,r1)*maxzb(l2,r2));
}
int anss=-1e18;
for(int i=0;i<ans.size();++i){
anss=max(anss,ans[i]);
}
cout<<anss<<"\n";
}
}
}