今年估计又寄了
#include <iostream>
#include <cstdio>
using namespace std;
const int kMaxN=1e5+1;
const int Max=2e9;
const int Min=-2e9;
int n,m,q;
int a[2][kMaxN];
int l1,r1,l2,r2;
struct XDS
{
int l,r;
int minzheng,maxzheng,minfu,maxfu;
bool zero;
}tr[2][kMaxN*4],ca,cb;
int cha,chb;
long long ans;
void Push(int th,int where)
{
tr[th][where].zero=tr[th][where<<1].zero|tr[th][where<<1|1].zero;
tr[th][where].minzheng=min(tr[th][where<<1].minzheng,tr[th][where<<1|1].minzheng);
tr[th][where].maxzheng=max(tr[th][where<<1].maxzheng,tr[th][where<<1|1].maxzheng);
tr[th][where].minfu=min(tr[th][where<<1].minfu,tr[th][where<<1|1].minfu);
tr[th][where].maxfu=max(tr[th][where<<1].maxfu,tr[th][where<<1|1].maxfu);
}
void Build(int th,int where,int l,int r)
{
tr[th][where].l=l,tr[th][where].r=r;
tr[th][where].minzheng=Max,tr[th][where].maxzheng=0,tr[th][where].minfu=0,tr[th][where].maxfu=Min;
if(l==r)
{
if(a[th][l]==0)tr[th][where].zero=true;
else if(a[th][l]>0)tr[th][where].minzheng=min(tr[th][where].minzheng,a[th][l]),tr[th][where].maxzheng=max(tr[th][where].maxzheng,a[th][l]);
else tr[th][where].minfu=min(tr[th][where].minfu,a[th][l]),tr[th][where].maxfu=max(tr[th][where].maxfu,a[th][l]);
return;
}
int mid=(l+r)>>1;
Build(th,where<<1,l,mid);
Build(th,where<<1|1,mid+1,r);
Push(th,where);
}
XDS Get(int th,int where,int l,int r)
{
//cout<<th<<" "<<where<<" "<<tr[th][where].l<<" "<<tr[th][where].r<<" "<<l<<" "<<r<<"\n";
if(tr[th][where].l>=l&&tr[th][where].r<=r)
{
//cout<<th<<" "<<tr[th][where].l<<" "<<tr[th][where].r<<" "<<tr[th][where].zero<<" "<<tr[th][where].maxzheng<<" "<<tr[th][where].minzheng<<" "<<tr[th][where].maxfu<<" "<<tr[th][where].minfu<<"\n";
return tr[th][where];
}
int mid=(tr[th][where].l+tr[th][where].r)>>1;
XDS ans;
ans.maxzheng=0,ans.minzheng=Max,ans.maxfu=Min,ans.minfu=0,ans.zero=false;
if(mid>=l)
{
XDS g=Get(th,where<<1,l,r);
ans.zero|=g.zero;
ans.minzheng=min(ans.minzheng,g.minzheng);
ans.maxzheng=max(ans.maxzheng,g.maxzheng);
ans.minfu=min(ans.minfu,g.minfu);
ans.maxfu=max(ans.maxfu,g.maxfu);
}
if(mid<r)
{
XDS g=Get(th,where<<1|1,l,r);
ans.zero|=g.zero;
ans.minzheng=min(ans.minzheng,g.minzheng);
ans.maxzheng=max(ans.maxzheng,g.maxzheng);
ans.minfu=min(ans.minfu,g.minfu);
ans.maxfu=max(ans.maxfu,g.maxfu);
}
//cout<<tr[th][where].l<<" "<<tr[th][where].r<<" "<<ans.zero<<" "<<ans.maxzheng<<" "<<ans.minzheng<<" "<<ans.maxfu<<" "<<ans.minfu<<"\n";
return ans;
}
int main()
{
//freopen("game.in","r",stdin);
//freopen("game.out","w",stdout);
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
{
cin>>a[0][i];
}
for(int i=1;i<=m;i++)
{
cin>>a[1][i];
}
Build(0,1,1,n);
Build(1,1,1,m);
while(q--)
{
cin>>l1>>r1>>l2>>r2;
//cout<<l1<<" "<<r1<<" "<<l2<<" "<<r2<<"\n";
ca=Get(0,1,l1,r1),cb=Get(1,1,l2,r2);
cha=chb=0;
//cout<<ca.zero<<" "<<ca.maxzheng<<" "<<ca.minzheng<<" "<<ca.maxfu<<" "<<ca.minfu<<"\n";
//cout<<cb.zero<<" "<<cb.maxzheng<<" "<<cb.minzheng<<" "<<cb.maxfu<<" "<<cb.minfu<<"\n";
if(cb.maxfu==Min)
{
if(ca.maxzheng!=0)cha=ca.maxzheng;
else if(ca.zero)cha=0;
else cha=ca.maxfu;
}
else if(cb.minzheng==Max)
{
if(ca.minfu!=0)cha=ca.minfu;
else if(ca.zero)cha=0;
else cha=ca.minzheng;
}
else
{
if(ca.zero)cha=0;
else if(ca.minzheng*1ll*cb.minfu>ca.maxfu*1ll*cb.maxzheng)cha=ca.minzheng;
else cha=ca.maxfu;
}
if(cha<0)
{
if(cb.maxzheng!=0)chb=cb.maxzheng;
else if(cb.zero)chb=0;
else chb=cb.maxfu;
}
else
{
if(cb.minfu!=0)chb=cb.minfu;
else if(cb.zero)chb=0;
else chb=cb.minzheng;
}
ans=1ll*cha*chb;
cout<<ans<<"\n";
}
return 0;
}