0pts,样例全过。
#include<cstdio>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
const int maxn=1e5+10;
int a[maxn],b[maxn],n,q,m,sa0[maxn],sb0[maxn],mnLz[20][maxn],mxLf[20][maxn],mxL[20][maxn],mnL[20][maxn],mxQ[20][maxn],mnQ[20][maxn];
int ck0(int l,int r,int op){
if(op==1) return (sa0[r]-sa0[l-1])>0;
return (sb0[r]-sb0[l-1])>0;
}
int quemx(int l,int r,int op){
int k=log(r-l+1)/log(2);
if(op==1) return max(mxL[k][l],mxL[k][r-(1<<k)+1]);
else return max(mxQ[k][l],mxQ[k][r-(1<<k)+1]);
}
int quemn(int l,int r,int op){
int k=log(r-l+1)/log(2);
if(op==1) return min(mnL[k][l],mnL[k][r-(1<<k)+1]);
else return min(mnQ[k][l],mnQ[k][r-(1<<k)+1]);
}
int quemnLz(int l,int r){
int k=log(r-l+1)/log(2);
return min(mnLz[k][l],mnLz[k][r-(1<<k)+1]);
}
int quemxLf(int l,int r){
int k=log(r-l+1)/log(2);
return max(mxLf[k][l],mxLf[k][r-(1<<k)+1]);
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&q);
for(int i=1ll;i<=n;i++){
scanf("%lld",&a[i]);
if(!a[i]) sa0[i]=sa0[i-1]+1;
else sa0[i]=sa0[i-1];
mxL[0][i]=mnL[0][i]=a[i];
mnLz[0][i]=(a[i]<=0)?1e15:a[i];
mxLf[0][i]=(a[i]>=0)?-1e15:a[i];
}
for(int i=1;i<=m;i++){
scanf("%lld",&b[i]);
if(!b[i]) sb0[i]=sb0[i-1]+1;
else sb0[i]=sb0[i-1];
mxQ[0][i]=mnQ[0][i]=b[i];
}
for(int i=1;i<=19;i++)
for(int j=1;j<=n;j++){
if(j+(1<<(i-1))>100000) continue;
mxL[i][j]=max(mxL[i-1][j],mxL[i-1][j+(1<<(i-1))]);
mnL[i][j]=min(mnL[i-1][j],mnL[i-1][j+(1<<(i-1))]);
mnLz[i][j]=min(mnLz[i-1][j],mnLz[i-1][j+(1<<(i-1))]);
mxLf[i][j]=max(mxLf[i-1][j],mxLf[i-1][j+(1<<(i-1))]);
}
for(int i=1;i<=19;i++)
for(int j=1;j<=m;j++){
if(j+(1<<(i-1))>100000) continue;
mxQ[i][j]=max(mxQ[i-1][j],mxQ[i-1][j+(1<<(i-1))]);
mnQ[i][j]=min(mnQ[i-1][j],mnQ[i-1][j+(1<<(i-1))]);
}
while(q--){
int l1,r1,l2,r2;
scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
int xL=quemx(l1,r1,1),nL=quemn(l1,r1,1),xQ=quemx(l2,r2,2),nQ=quemn(l2,r2,2),nLz=quemnLz(l1,r1),xLf=quemxLf(l1,r1),ans=-1e15;
for(int i=1;i<=5;i++){
int x=0,y=0;
if(i==1) x=xL;
if(i==2) x=nL;
if(i==3&&!ck0(l1,r1,1)) continue;
if(i==3&&ck0(l1,r1,1)) x=0;
if(i==4&&nLz==(int)1e15) continue;
if(i==4&&nLz!=(int)1e15) x=nLz;
if(i==5&&xLf==(int)-1e15) continue;
if(i==5&&xLf!=(int)-1e15) x=xLf;
int tmp=1e15;
for(int j=1;j<=3;j++){
if(j==1) y=xQ;
if(j==2) y=nQ;
if(j==3&&ck0(l2,r2,2)) y=0;
if(j==3&&!ck0(l2,r2,2)) continue;
tmp=min(tmp,x*y);
}
ans=max(ans,tmp);
}
printf("%lld\n",ans);
}
return 0;
}