#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
struct TREE{
ll mx[N<<2],mn[N<<2];
ll mx1[N<<2],mn1[N<<2];
bool zeo[N<<2];
TREE(){memset(mx,128,sizeof mx);
memset(mn,127,sizeof mn);
memset(mx1,128,sizeof mx1);
memset(mn1,127,sizeof mn1);
}
void pushup(int p)
{
mx[p]=max(mx[p<<1],mx[p<<1|1]);
mn[p]=min(mn[p<<1],mn[p<<1|1]);
mx1[p]=max(mx1[p<<1],mx1[p<<1|1]);
mn1[p]=min(mn1[p<<1],mn1[p<<1|1]);
}
void build(int p,int l,int r,int a[])
{
if(l==r)
{
mx[p]=mn[p]=a[l];
if(a[l]>0)
{
mn1[p]=a[l];
}
else if(a[l]<0)
{
mx1[p]=a[l];
}
else if(!a[l])mx1[p]=mn1[p]=0;
return;
}
int mid=l+r>>1;
build(p<<1,l,mid,a);
build(p<<1|1,mid+1,r,a);
pushup(p);
}
bool chez1(int p,int l,int r,int le,int ri)
{
if(l>=le && r<=ri)
{
if(mx[p]>0)return 1;
else return 0;
}
int mid=l+r>>1;
if(le<=mid && chez1(p<<1,l,mid,le,ri))return 1;
if(ri>mid && chez1(p<<1|1,mid+1,r,le,ri))return 1;
return 0;
}
bool chez2(int p,int l,int r,int le,int ri)
{
if(l>=le && r<=ri)
{
if(mn[p]<0)return 1;
else return 0;
}
int mid=l+r>>1;
if(le<=mid && chez2(p<<1,l,mid,le,ri))return 1;
if(ri>mid && chez2(p<<1|1,mid+1,r,le,ri))return 1;
return 0;
}
bool chez3(int p,int l,int r,int le,int ri)
{
if(l>=le && r<=ri)
{
if(mx1[p]==0 || mn1[p]==0)return 1;
else return 0;
}
int mid=l+r>>1;
if(le<=mid && chez3(p<<1,l,mid,le,ri))return 1;
if(ri>mid && chez3(p<<1|1,mid+1,r,le,ri))return 1;
return 0;
}
ll quary1(int p,int l,int r,int le,int ri)
{
if(l>=le && r<=ri)
{
return mx[p];
}
ll mid=l+r>>1;
ll ans=-1e18;
if(le<=mid) ans=max(ans,quary1(p<<1,l,mid,le,ri));
if(ri>mid) ans=max(ans,quary1(p<<1|1,mid+1,r,le,ri));
return ans;
}
ll quary2(int p,int l,int r,int le,int ri)
{
if(l>=le && r<=ri)
{
return mn[p];
}
int mid=l+r>>1;
ll ans=1e18;
if(le<=mid) ans=min(ans,quary2(p<<1,l,mid,le,ri));
if(ri>mid) ans=min(ans,quary2(p<<1|1,mid+1,r,le,ri));
return ans;
}
ll quary3(int p,int l,int r,int le,int ri)
{
if(l>=le && r<=ri)
{
return mn1[p];
}
int mid=l+r>>1;
ll ans=1e18;
if(le<=mid) ans=min(ans,quary3(p<<1,l,mid,le,ri));
if(ri>mid) ans=min(ans,quary3(p<<1|1,mid+1,r,le,ri));
return ans;
}
ll quary4(int p,int l,int r,int le,int ri)
{
if(l>=le && r<=ri)
{
return mx1[p];
}
int mid=l+r>>1;
ll ans=-1e18;
if(le<=mid) ans=max(ans,quary4(p<<1,l,mid,le,ri));
if(ri>mid) ans=max(ans,quary4(p<<1|1,mid+1,r,le,ri));
return ans;
}
}tr1,tr2;
int n,m,q;
int a[N],b[N];
int main()
{
// freopen("game.in","r",stdin);//wyf bless me
// freopen("game.out","w",stdout);//wyf bless me
scanf("%d%d%d",&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]);
tr1.build(1,1,n,a);
tr2.build(1,1,m,b);
for(int i=1;i<=q;i++)
{
int l1,r1,l2,r2;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
if(!tr1.chez1(1,1,n,l1,r1))
{
if(tr2.chez1(1,1,m,l2,r2))
{
cout<<tr1.quary1(1,1,n,l1,r1)*tr2.quary1(1,1,m,l2,r2)<<endl;
}
else
{
cout<<tr1.quary2(1,1,n,l1,r1)*tr2.quary1(1,1,m,l2,r2)<<endl;
}
}
else if(!tr1.chez2(1,1,n,l1,r1))
{
if(tr2.chez2(1,1,m,l2,r2))
{
cout<<tr1.quary2(1,1,n,l1,r1)*tr2.quary2(1,1,m,l2,r2)<<endl;
}
else
{
cout<<tr1.quary1(1,1,n,l1,r1)*tr2.quary2(1,1,m,l2,r2)<<endl;
}
}
else
{
if(!tr2.chez1(1,1,m,l2,r2))
{
cout<<tr1.quary2(1,1,n,l1,r1)*tr2.quary1(1,1,m,l2,r2)<<endl;
}
else if(!tr2.chez2(1,1,m,l2,r2))
{
cout<<tr1.quary1(1,1,n,l1,r1)*tr2.quary2(1,1,m,l2,r2)<<endl;
}
else if(tr2.chez3(1,1,m,l2,r2) || tr1.chez3(1,1,n,l1,r1))
{
cout<<"0"<<endl;
}
else
{
cout<<max(tr1.quary3(1,1,n,l1,r1)*tr2.quary2(1,1,m,l2,r2),tr1.quary4(1,1,n,l1,r1)*tr2.quary1(1,1,m,l2,r2))<<endl;
}
}
}
return 0;
}
95pts WA #18