rt
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-f;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
void write(int x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>=10)
write(x/10);
putchar(x%10+'0');
}
struct Wryyyyy{
int l,r,sum;
};
Wryyyyy amaxtree[400010],amintree[400010],bmaxtree[400010],bmintree[400010],treezero1[400010],treezero2[400010];
int a[100010],b[100010];
void builda(int n,int l,int r)
{
amaxtree[n].l=l;
amaxtree[n].r=r;
amintree[n].l=l;
amintree[n].r=r;
treezero1[n].l=l;
treezero1[n].r=r;
treezero2[n].l=l;
treezero2[n].r=r;
if(l==r)
{
amaxtree[n].sum=a[l];
amintree[n].sum=a[l];
treezero1[n].sum=a[l];
treezero2[n].sum=a[l];
return;
}
int mid=(l+r)>>1;
builda(n*2,l,mid);
builda((n*2)|1,mid+1,r);
amaxtree[n].sum=max(amaxtree[n*2].sum,amaxtree[(n*2)|1].sum);
amintree[n].sum=min(amintree[n*2].sum,amintree[(n*2)|1].sum);
int tmp;
if(treezero1[n*2].sum<=0&&treezero1[(n*2)|1].sum>=0)
treezero1[n].sum=treezero1[(n*2)|1].sum;
else if(treezero1[n*2].sum>=0&&treezero1[(n*2)|1].sum<=0)
treezero1[n].sum=treezero1[n*2].sum;
else if(abs(treezero1[n*2].sum)<abs(treezero1[(n*2)|1].sum))
treezero1[n].sum=treezero1[n*2].sum;
else
treezero1[n].sum=treezero1[(n*2)|1].sum;
if(treezero2[n*2].sum<=0&&treezero2[(n*2)|1].sum>=0)
treezero2[n].sum=treezero2[n*2].sum;
if(treezero2[n*2].sum>=0&&treezero2[(n*2)|1].sum<=0)
treezero2[n].sum=treezero2[(n*2)|1].sum;
else if(abs(treezero2[n*2].sum)<abs(treezero2[(n*2)|1].sum))
treezero2[n].sum=treezero2[n*2].sum;
else
treezero2[n].sum=treezero2[(n*2)|1].sum;
}
void buildb(int n,int l,int r)
{
bmaxtree[n].l=l;
bmaxtree[n].r=r;
bmintree[n].l=l;
bmintree[n].r=r;
if(l==r)
{
bmaxtree[n].sum=b[l];
bmintree[n].sum=b[l];
return;
}
int mid=(l+r)>>1;
buildb(n*2,l,mid);
buildb((n*2)|1,mid+1,r);
bmaxtree[n].sum=max(bmaxtree[n*2].sum,bmaxtree[(n*2)|1].sum);
bmintree[n].sum=min(bmintree[n*2].sum,bmintree[(n*2)|1].sum);
}
int afind_maxn(int n,int l,int r)
{
if(amaxtree[n].l>=l&&amaxtree[n].r<=r)
return amaxtree[n].sum;
if(amaxtree[n].r<l||amaxtree[n].l>r)
return -INT_MAX+10;
return max(afind_maxn(n*2,l,r),afind_maxn((n*2)|1,l,r));
}
int afind_minn(int n,int l,int r)
{
if(amintree[n].l>=l&&amintree[n].r<=r)
return amintree[n].sum;
if(amintree[n].r<l||amintree[n].l>r)
return INT_MAX-10;
return min(afind_minn(n*2,l,r),afind_minn((n*2)|1,l,r));
}
int bfind_maxn(int n,int l,int r)
{
if(bmaxtree[n].l>=l&&bmaxtree[n].r<=r)
return bmaxtree[n].sum;
if(bmaxtree[n].r<l||bmaxtree[n].l>r)
return -INT_MAX+10;
return max(bfind_maxn(n*2,l,r),bfind_maxn((n*2)|1,l,r));
}
int bfind_minn(int n,int l,int r)
{
if(bmintree[n].l>=l&&bmintree[n].r<=r)
return bmintree[n].sum;
if(bmintree[n].r<l||bmintree[n].l>r)
return INT_MAX-10;
return min(bfind_minn(n*2,l,r),bfind_minn((n*2)|1,l,r));
}
int find_zero1(int n,int l,int r)
{
if(treezero1[n].l>=l&&treezero1[n].r<=r)
return treezero1[n].sum;
if(treezero1[n].l>r||treezero1[n].r<l)
return -INT_MAX+10;
int tmp1=find_zero1(n*2,l,r);
int tmp2=find_zero1((n*2)|1,l,r);
if(tmp1<=0&&tmp2>=0)
return tmp2;
else if(tmp1>=0&&tmp2<=0)
return tmp1;
else if(abs(tmp1)<abs(tmp2))
return tmp1;
else
return tmp2;
}
int find_zero2(int n,int l,int r)
{
if(treezero2[n].l>=l&&treezero2[n].r<=r)
return treezero2[n].sum;
if(treezero2[n].l>r||treezero2[n].r<l)
return INT_MAX-10;
int tmp1=find_zero2(n*2,l,r);
int tmp2=find_zero2((n*2)|1,l,r);
if(tmp1<=0&&tmp2>=0)
return tmp1;
else if(tmp1>=0&&tmp2<=0)
return tmp2;
else if(abs(tmp1)<abs(tmp2))
return tmp1;
else
return tmp2;
}
int n,m,k,l1,r1,l2,r2;
bool high_=true;
void init()
{
n=read();
m=read();
k=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
if(a[i]<0)
high_=false;
}
builda(1,1,n);
for(int i=1;i<=m;i++)
{
b[i]=read();
if(b[i]<0)
high_=false;
}
buildb(1,1,m);
}
signed main()
{
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
init();
while(k--)
{
l1=read();
r1=read();
l2=read();
r2=read();
if(high_)
{
int ans=afind_maxn(1,l1,r1)*bfind_minn(1,l2,r2);
if(ans!=0)
write(ans);
else
putchar('0');
putchar('\n');
}
else if(l1==r1)
{
int ans;
if(a[l1]==0)
ans=0;
if(a[l1]>0)
ans=a[l1]*bfind_minn(1,l2,r2);
if(a[l1]<0)
ans=a[l1]*bfind_maxn(1,l2,r2);
if(ans!=0)
write(ans);
else
putchar('0');
putchar('\n');
}
else if(l2==r2)
{
int ans;
if(b[l2]==0)
ans=0;
if(b[l2]>0)
ans=b[l2]*afind_maxn(1,l2,r2);
if(b[l2]<0)
ans=b[l2]*afind_minn(1,l2,r2);
if(ans!=0)
write(ans);
else
putchar('0');
putchar('\n');
}
else
{
int maxa=afind_maxn(1,l1,r1);
int mina=afind_minn(1,l1,r1);
int maxb=bfind_maxn(1,l2,r2);
int minb=bfind_minn(1,l2,r2);
int za1=find_zero1(1,l1,r1);
int za2=find_zero2(1,l1,r1);
int ans;
if(maxb>=0&&minb<=0)
{
if(za1>0&&za2<0)
ans=max(za1*minb,za2*maxb);
if(za1==0||za2==0)
ans=0;
if(za1>0&&za2>0)
ans=max(za1*minb,za2*minb);
if(za1<0&&za2<0)
ans=max(za1*maxb,za2*maxb);
if(ans!=0)
write(ans);
else
putchar('0');
putchar('\n');
}
else if(maxb>0&&minb>0)
{
ans=afind_maxn(1,l1,r1)*bfind_minn(1,l2,r2);
if(ans!=0)
write(ans);
else
putchar('0');
putchar('\n');
}
else if(maxb<0&&minb<0)
{
ans=afind_minn(1,l1,r1)*maxb;
if(ans!=0)
write(ans);
else
putchar('0');
putchar('\n');
}
}
}
return 0;
}