#include<bits/stdc++.h>
using namespace std;
const int N=100020,inf=0x7f7f7f7f;
int n,m,q,a[N],b[N];
struct Tree{
int l,r,max,min;
int pos_max,pos_min,neg_max,neg_min;
}t_a[N*4],t_b[N*4];
bool f1=0,f2=0;
int l1,r1,l2,r2;
void update(int id,Tree t[]){
t[id].max=max(t[id*2].max,t[id*2+1].max);
t[id].min=min(t[id*2].min,t[id*2+1].min);
t[id].pos_max=max(t[id*2].pos_max,t[id*2+1].pos_max);
t[id].pos_min=min(t[id*2].pos_min,t[id*2+1].pos_min);
t[id].neg_max=max(t[id*2].neg_max,t[id*2+1].neg_max);
t[id].neg_min=min(t[id*2].neg_min,t[id*2+1].neg_min);
}
void build(int id,int l,int r,Tree t[],int x[]){
t[id]={l,r};
if(l==r){
t[id].max=t[id].min=x[l];
if(x[l]>=0){
t[id].pos_max=t[id].pos_min=x[l];
t[id].neg_max=-inf;
t[id].neg_min=inf;
}else{
t[id].neg_max=t[id].neg_min=x[l];
t[id].pos_max=-inf;
t[id].pos_min=inf;
}
return;
}
int mid=(l+r)/2;
build(id*2,l,mid,t,x);
build(id*2+1,mid+1,r,t,x);
update(id,t);
}
int askformax(int id,int l,int r,Tree t[]){
if(l<=t[id].l&&r>=t[id].r){
return t[id].max;
}
int ans=-inf;
int mid=(t[id].l+t[id].r)/2;
if(l<=mid)ans=max(ans,askformax(id*2,l,r,t));
if(r>mid)ans=max(ans,askformax(id*2+1,l,r,t));
return ans;
}
int askformin(int id,int l,int r,Tree t[]){
if(l<=t[id].l&&r>=t[id].r){
return t[id].min;
}
int ans=inf;
int mid=(t[id].l+t[id].r)/2;
if(l<=mid)ans=min(ans,askformin(id*2,l,r,t));
if(r>mid)ans=min(ans,askformin(id*2+1,l,r,t));
return ans;
}
int askforpos_max(int id,int l,int r,Tree t[]){
if(l<=t[id].l&&r>=t[id].r){
return t[id].pos_max;
}
int ans=-inf;
int mid=(t[id].l+t[id].r)/2;
if(l<=mid)ans=max(ans,askforpos_max(id*2,l,r,t));
if(r>mid)ans=max(ans,askforpos_max(id*2+1,l,r,t));
return ans;
}
int askforpos_min(int id,int l,int r,Tree t[]){
if(l<=t[id].l&&r>=t[id].r){
return t[id].pos_min;
}
int ans=inf;
int mid=(t[id].l+t[id].r)/2;
if(l<=mid)ans=min(ans,askforpos_min(id*2,l,r,t));
if(r>mid)ans=min(ans,askforpos_min(id*2+1,l,r,t));
return ans;
}
int askforneg_max(int id,int l,int r,Tree t[]){
if(l<=t[id].l&&r>=t[id].r){
return t[id].neg_max;
}
int ans=-inf;
int mid=(t[id].l+t[id].r)/2;
if(l<=mid)ans=max(ans,askforneg_max(id*2,l,r,t));
if(r>mid)ans=max(ans,askforneg_max(id*2+1,l,r,t));
return ans;
}
int askforneg_min(int id,int l,int r,Tree t[]){
if(l<=t[id].l&&r>=t[id].r){
return t[id].neg_min;
}
int ans=inf;
int mid=(t[id].l+t[id].r)/2;
if(l<=mid)ans=min(ans,askforneg_min(id*2,l,r,t));
if(r>mid)ans=min(ans,askforneg_min(id*2+1,l,r,t));
return ans;
}
int main(){
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]<0)f1=1;
}
for(int i=1;i<=m;i++){
scanf("%d",&b[i]);
if(b[i]<0)f2=1;
}
build(1,1,n,t_a,a);
build(1,1,m,t_b,b);
while(q--){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
if(f1==0&&f2==0){
printf("%d\n",askformax(1,l1,r1,t_a)*askformin(1,l2,r2,t_b));
continue;
}
int ans=-inf;
int a_pos_max=askforpos_max(1,l1,r1,t_a);
int a_pos_min=askforpos_min(1,l1,r1,t_a);
int a_neg_max=askforneg_max(1,l1,r1,t_a);
int a_neg_min=askforneg_min(1,l1,r1,t_a);
int b_max=askformax(1,l2,r2,t_b);
int b_min=askformin(1,l2,r2,t_b);
if(a_pos_max!=-inf)ans=max(ans,a_pos_max*b_min);
else ans=max(ans,a_neg_max*b_max);
if(a_neg_min!=inf)ans=max(ans,a_neg_min*b_max);
else ans=max(ans,a_pos_min*b_min);
if(a_neg_max!=-inf)ans=max(ans,a_neg_max*b_max);
if(a_pos_min!=inf)ans=max(ans,a_pos_min*b_min);
printf("%d\n",ans);
}
return 0;
}