rt。
开了就过了。
代码:
#include<cstdio>
#define int __int128
template<typename T>void read(T &x){
x=0;bool f=0;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=1;
for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
if(f)x=-x;
}
void write(char x){putchar(x);}
template<typename T>void write(T x){
x<0?putchar('-'),x=-x:false;
char stk[14];int top=0;
do stk[++top]=x%10+48,x/=10;while(x);
for(;top;top--)putchar(stk[top]);
}
template<typename T,typename ...Args>void read(T &a,Args &...args){read(a);read(args...);}
template<typename T,typename ...Args>void write(T a,Args ...args){write(a);write(args...);}
template<typename T>T min(T a,T b){return a>b?b:a;}
template<typename T,typename ...Args>T min(T a,T b,Args ...args){return min(a,min(b,args...));}
template<typename T>T max(T a,T b){return a>b?a:b;}
template<typename T,typename ...Args>T max(T a,T b,Args ...args){return max(a,max(b,args...));}
template<typename T>void Swap(T &a,T &b){a^=b^=a^=b;}
template<typename T>T abs(T a){return a<0?-a:a;}
const int maxn=1e5+4;
struct tree{
#define mid ((l+r)>>1)
int a[maxn],minn[maxn<<2],maxx[maxn<<2];
void build(int k,int l,int r,bool flag){
if(l==r){
if((a[l]==-1ll&&flag)||(a[l]==1ll&&!flag))minn[k]=1e18,maxx[k]=-1e18;
else minn[k]=maxx[k]=a[l];
return;
}
build(k<<1,l,mid,flag);build(k<<1|1,mid+1,r,flag);
minn[k]=min(minn[k<<1],minn[k<<1|1]);
maxx[k]=max(maxx[k<<1],maxx[k<<1|1]);
}
int query_min(int k,int l,int r,int x,int y){
if(x<=l&&r<=y)return minn[k];
int ans=1e18;
if(x<=mid)ans=min(ans,query_min(k<<1,l,mid,x,y));
if(y>mid)ans=min(ans,query_min(k<<1|1,mid+1,r,x,y));
return ans;
}
int query_max(int k,int l,int r,int x,int y){
if(x<=l&&r<=y)return maxx[k];
int ans=-1e18;
if(x<=mid)ans=max(ans,query_max(k<<1,l,mid,x,y));
if(y>mid)ans=max(ans,query_max(k<<1|1,mid+1,r,x,y));
return ans;
}
#undef mid
}x,y/*正数*/,xx,yy;
int n,m,q,a[maxn],b[maxn];
signed main(){
read(n,m,q);
for(int i=1;i<=n;++i)read(a[i]);
for(int i=1;i<=m;++i)read(b[i]);
for(int i=1;i<=n;++i)x.a[i]=max((__int128)-1,a[i]);
for(int i=1;i<=n;++i)y.a[i]=max((__int128)-1ll,b[i]);
for(int i=1;i<=n;++i)xx.a[i]=min((__int128)1ll,a[i]);
for(int i=1;i<=n;++i)yy.a[i]=min((__int128)1ll,b[i]);
x.build(1,1,n,1);y.build(1,1,n,1);xx.build(1,1,n,0);yy.build(1,1,n,0);
for(;q--;){
int l,r,ll,rr;read(l,r,ll,rr);
int ans=-1e18,ui=0;
if(y.query_min(1,1,n,ll,rr)!=1e18)ui++,ans=max(ans,xx.query_max(1,1,n,l,r)*y.query_max(1,1,n,ll,rr));
else ans=max(ans,xx.query_min(1,1,n,l,r)*yy.query_max(1,1,n,ll,rr));
if(yy.query_max(1,1,n,ll,rr)!=-1e18)ui++,ans=max(ans,x.query_min(1,1,n,l,r)*yy.query_min(1,1,n,ll,rr));
else ans=max(ans,x.query_max(1,1,n,l,r)*y.query_min(1,1,n,ll,rr));
write(ans,'\n');
}
return 0;
}