我用的笨办法线段树,有点太长了。。。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=500014;
#define mid ((l+r)>>1)
int a[N],b[N],maxa[N<<2],mina[N<<2],ma[N<<2],fa[N<<2],maxb[N<<2],minb[N<<2],n,m,q;
void buildb(int k,int l,int r)
{
if(l==r)
{
maxb[k]=b[l];
minb[k]=b[l];
return;
}
buildb(k<<1,l,mid);
buildb(k<<1|1,mid+1,r);
maxb[k]=max(maxb[k<<1],maxb[k<<1|1]);
minb[k]=min(minb[k<<1],minb[k<<1|1]);
}
void builda(int k,int l,int r)
{
if(l==r)
{
if(a[l]<0)fa[k]=a[l];
else fa[k]=LONG_LONG_MIN;
if(a[k]>=0)ma[k]=a[l];
else ma[k]=LONG_LONG_MAX;
maxa[k]=a[l];
mina[k]=a[l];
return;
}
builda(k<<1,l,mid);
builda(k<<1|1,mid+1,r);
maxa[k]=max(maxa[k<<1],maxa[k<<1|1]);
mina[k]=min(mina[k<<1],mina[k<<1|1]);
fa[k]=max(fa[k<<1],fa[k<<1|1]);
ma[k]=min(ma[k<<1],ma[k<<1|1]);
}
int getamax(int k,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
return maxa[k];
}
int sum=LONG_LONG_MIN;
if(x<=mid)
{
sum=max(sum,getamax(k<<1,l,mid,x,y));
}
if(y>mid)
{
sum=max(sum,getamax(k<<1|1,mid+1,r,x,y));
}
return sum;
}
int getbmax(int k,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
return maxb[k];
}
int sum=LONG_LONG_MIN;
if(x<=mid)
{
sum=max(sum,getbmax(k<<1,l,mid,x,y));
}
if(y>mid)
{
sum=max(sum,getbmax(k<<1|1,mid+1,r,x,y));
}
return sum;
}
int getamin(int k,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
return mina[k];
}
int sum=LONG_LONG_MAX;
if(x<=mid)
{
sum=min(sum,getamin(k<<1,l,mid,x,y));
}
if(y>mid)
{
sum=min(sum,getamin(k<<1|1,mid+1,r,x,y));
}
return sum;
}
int getbmin(int k,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
return minb[k];
}
int sum=LONG_LONG_MAX;
if(x<=mid)
{
sum=min(sum,getbmin(k<<1,l,mid,x,y));
}
if(y>mid)
{
sum=min(sum,getbmin(k<<1|1,mid+1,r,x,y));
}
return sum;
}
int getaqumin(int k,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
return ma[k];
}
int sum=LONG_LONG_MAX;
if(x<=mid)
{
sum=min(sum,getaqumin(k<<1,l,mid,x,y));
}
if(y>mid)
{
sum=min(sum,getaqumin(k<<1|1,mid+1,r,x,y));
}
return sum;
}
int getaqumax(int k,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
return fa[k];
}
int sum=LONG_LONG_MIN;
if(x<=mid)
{
sum=max(sum,getaqumax(k<<1,l,mid,x,y));
}
if(y>mid)
{
sum=max(sum,getaqumax(k<<1|1,mid+1,r,x,y));
}
return sum;
}
signed main()
{
scanf("%lld%lld%lld",&n,&m,&q);
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
}
for(int i=1;i<=m;i++)
{
scanf("%lld",&b[i]);
}
builda(1,1,n);
buildb(1,1,m);
while(q--)
{
int x,y,xx,yy;
scanf("%lld%lld%lld%lld",&x,&y,&xx,&yy);
int mx,my,ans1=LONG_LONG_MIN;
my=getbmin(1,1,m,xx,yy);
if(my>=0)
{
mx=getamax(1,1,n,x,y);
if(mx>=0)
ans1=mx*my;
}
else
{
mx=getaqumin(1,1,n,x,y);
if(mx>=0)
ans1=max(ans1,mx*my);
}
my=getbmax(1,1,m,xx,yy);
if(my>=0)
{
mx=getaqumin(1,1,n,x,y);
if(x<0)
{
ans1=max(ans1,mx*my);
}
}
else
{
mx=getamin(1,1,n,x,y);
if(x<0)
{
ans1=max(ans1,mx*my);
}
}
cout<<ans1<<'\n';
}
return 0;
}