```
#include<iostream>
#define mp make_pair
#define int long long
using namespace std;
inline int read(){
int x=0,flag=1;char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-')flag=-1;ch=getchar();}
while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x*flag;
}
const int N=1e5+10;
const int inf=3e18;
struct Node{
int l,r,nmax,nmin;
int above,below;
bool zero;
};
Node ta[N<<2],tb[N<<2];
Node operator +(const Node &a,const Node &b){
Node res;
res.l=a.l;res.r=b.r;
res.nmax=max(a.nmax,b.nmax);
res.nmin=min(a.nmin,b.nmin);
res.above=min(a.above,b.above);
res.below=max(a.below,b.below);
res.zero=a.zero&&b.zero;
return res;
}
void builda(int p,int l,int r){
ta[p].l=l,ta[p].r=r;
if(l==r){int x=read();ta[p].nmax=ta[p].nmin=x;ta[p].above=(x>=0)?x:inf;ta[p].below=(x<=0)?x:-inf;ta[p].zero=x==0;return;}
int mid=(l+r)>>1;
builda(p<<1,l,mid);
builda(p<<1|1,mid+1,r);
ta[p]=ta[p<<1]+ta[p<<1|1];
}
void buildb(int p,int l,int r){
tb[p].l=l,tb[p].r=r;
if(l==r){int x=read();tb[p].nmax=tb[p].nmin=x;tb[p].above=(x>=0)?x:inf;tb[p].below=(x<=0)?x:-inf;tb[p].zero=x==0;return;}
int mid=(l+r)>>1;
buildb(p<<1,l,mid);
buildb(p<<1|1,mid+1,r);
tb[p]=tb[p<<1]+tb[p<<1|1];
}
int getmina(int p,int l,int r){
if(l<=ta[p].l && ta[p].r<=r) return ta[p].nmin;
int mid=(ta[p].l+ta[p].r)>>1,res=inf;
if(l<=mid) res=min(res,getmina(p<<1,l,r));
if(mid<r) res=min(res,getmina(p<<1|1,l,r));
return res;
}
int getminb(int p,int l,int r){
if(l<=tb[p].l && tb[p].r<=r) return tb[p].nmin;
int mid=(tb[p].l+tb[p].r)>>1,res=inf;
if(l<=mid) res=min(res,getminb(p<<1,l,r));
if(mid<r) res=min(res,getminb(p<<1|1,l,r));
return res;
}
int getmaxa(int p,int l,int r){
if(l<=ta[p].l && ta[p].r<=r) return ta[p].nmax;
int mid=(ta[p].l+ta[p].r)>>1,res=-inf;
if(l<=mid) res=max(res,getmaxa(p<<1,l,r));
if(mid<r) res=max(res,getmaxa(p<<1|1,l,r));
return res;
}
int getmaxb(int p,int l,int r){
if(l<=tb[p].l && tb[p].r<=r) return tb[p].nmax;
int mid=(tb[p].l+tb[p].r)>>1,res=-inf;
if(l<=mid) res=max(res,getmaxb(p<<1,l,r));
if(mid<r) res=max(res,getmaxb(p<<1|1,l,r));
return res;
}
int getabovea(int p,int l,int r){
if(l<=ta[p].l && ta[p].r<=r) return ta[p].above;
int mid=(ta[p].l+ta[p].r)>>1,res=inf;
if(l<=mid) res=min(res,getabovea(p<<1,l,r));
if(mid<r) res=min(res,getabovea(p<<1|1,l,r));
return res;
}
int getbelowa(int p,int l,int r){
if(l<=ta[p].l && ta[p].r<=r) return ta[p].below;
int mid=(ta[p].l+ta[p].r)>>1,res=-inf;
if(l<=mid) res=max(res,getbelowa(p<<1,l,r));
if(mid<r) res=max(res,getbelowa(p<<1|1,l,r));
return res;
}
bool pd(int p,int l,int r){
if(l<=ta[p].l && ta[p].r<=r) return ta[p].zero;
bool res=true;
int mid=(ta[p].l+ta[p].r)>>1;
if(l<=mid) res=res && pd(p<<1,l,r);
if(mid<r) res=res && pd(p<<1|1,l,r);
return res;
}
signed main(){
int n=read(),m=read(),q=read();
builda(1,1,n);
buildb(1,1,m);
for(int i=1;i<=q;++i){
int l1=read(),r1=read(),l2=read(),r2=read();
int Lmin=getmina(1,l1,r1),Lmax=getmaxa(1,l1,r1);
int Qmin=getminb(1,l2,r2),Qmax=getmaxb(1,l2,r2);
if(Qmin>=0){
if(Lmax>=0) cout<<Lmax*Qmin<<'\n';
else cout<<Lmax*Qmax<<'\n';
}else if(Qmax<=0){
if(Lmin<=0) cout<<Lmin*Qmax<<'\n';
else cout<<Lmin*Qmin<<'\n';
}else{
if(pd(1,l1,r1)) {cout<<"0\n";continue;}//here
if(Lmin>=0) cout<<Lmin*Qmin<<'\n';
if(Lmax<=0) cout<<Lmax*Qmax<<'\n';
if(Lmin<0 && Lmax>0){
int tmp=max(getabovea(1,l1,r1)*Qmin,getbelowa(1,l1,r1)*Qmax);
cout<<tmp<<'\n';
}
}
}
}
```
不加那一行的话只能的95tps
by dyyzy_qwq @ 2023-09-23 11:23:36
@dyyzy 哪一行
by WrongAnswer_90 @ 2023-09-28 09:32:04
>建议加上else —— wronganswer_90
还是我太菜了(悲
by dyyzy_qwq @ 2023-09-28 09:53:05