开了几个st表贪心求的,感觉没有问题但是洛谷上WA了一个点
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=0x3f3f3f3f;
void read(int &ret){
int res=0ll,fs=1ll;
char a=getchar();
while(a<'0'||a>'9'){
if(a=='-'){
fs*=-1ll;
}
a=getchar();
}
while(a>='0'&&a<='9'){
res*=10ll;res+=(int)(a-'0');
a=getchar();
}
ret=res*fs;
}
void Max(int &a,int b){
if(a<b) a=b;
}
const int N=1e5+7;
int n,m,q;
int a[N],b[N],logt[N];
void pre_log(){
logt[1]=0;
for(int i=2;i<=n;++i){
logt[i]=logt[i/2]+1;
}
}
struct yzh{
int st[2][22][N];
void pre_st(int ed){
for(int i=1;i<=20;++i){
for(int j=1;j+(1<<i)-1<=ed;++j){
st[0][i][j]=min(st[0][i-1][j],st[0][i-1][j+(1<<(i-1))]);
st[1][i][j]=max(st[1][i-1][j],st[1][i-1][j+(1<<(i-1))]);
}
}
}
}af,az,tb;
int qz[N];
signed main(){
// freopen("game.in","r",stdin);
// freopen("game.out","w",stdout);
read(n);read(m);read(q);
for(int i=1;i<=n;++i){
read(a[i]);
if(a[i]<0){
af.st[0][0][i]=af.st[1][0][i]=a[i];
az.st[0][0][i]=inf;
}
else{
az.st[0][0][i]=az.st[1][0][i]=a[i];
af.st[1][0][i]=-inf;
qz[i]++;
}
qz[i]+=qz[i-1];
}
for(int i=1;i<=m;++i){
read(b[i]);tb.st[0][0][i]=tb.st[1][0][i]=b[i];
}
pre_log();
tb.pre_st(m);af.pre_st(n);az.pre_st(n);
while(q--){
int l1,r1,l2,r2;
read(l1);read(r1);read(l2);read(r2);
int lg1=logt[r1-l1+1],lg2=logt[r2-l2+1];
int minb=min(tb.st[0][lg2][l2],tb.st[0][lg2][r2-(1<<lg2)+1]);
int maxb=max(tb.st[1][lg2][l2],tb.st[1][lg2][r2-(1<<lg2)+1]);
int maxn;
bool flag=true;
if(qz[r1]-qz[l1-1]){
maxn=max(az.st[1][lg1][l1],az.st[1][lg1][r1-(1<<lg1)+1])*minb;
Max(maxn,min(az.st[0][lg1][l1],az.st[0][lg1][r1-(1<<lg1)+1])*minb);
flag=false;
}
// cout<<":::"<<max(az.st[1][lg1][l1],az.st[1][lg1][r1-(1<<lg1)+1])<<endl;
if(qz[r1]-qz[l1-1]<(r1-l1+1)){
if(flag) maxn=min(af.st[0][lg1][l1],af.st[0][lg1][r1-(1<<lg1)+1])*maxb;
Max(maxn,min(af.st[0][lg1][l1],af.st[0][lg1][r1-(1<<lg1)+1])*maxb);
Max(maxn,max(af.st[1][lg1][l1],af.st[1][lg1][r1-(1<<lg1)+1])*maxb);
}
// cout<<minb<<" "<<maxb<<endl;
printf("%lld\n",maxn);
}
return 0;
}