#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define N 100005
using namespace std;
struct node {
int minn,maxn;
node() {
minn=0x3f3f3f3f;
maxn=-0x3f3f3f3f;
}
} f1[N][35],f2[N][35],f3[N][35];
int n,m,q;
int query1(int l,int r,int p,int q) {
int k=log2(r-l+1);
if(!q) {
if(!p)
return max(f1[l][k].maxn,f1[r-(1<<k)+1][k].maxn);
return min(f1[l][k].minn,f1[r-(1<<k)+1][k].minn);
}
if(!p)
return max(f2[l][k].maxn,f2[r-(1<<k)+1][k].maxn);
return min(f2[l][k].minn,f2[r-(1<<k)+1][k].minn);
}
int query2(int l,int r,int p) {
int k=log2(r-l+1);
if(!p)
return max(f3[l][k].maxn,f3[r-(1<<k)+1][k].maxn);
return min(f3[l][k].minn,f3[r-(1<<k)+1][k].minn);
}
int main() {
scanf("%d%d%d",&n,&m,&q);
for(int i=1; i<=n; ++i) {
int a;
scanf("%d",&a);
if(a>=0) {
f1[i][0].maxn=f1[i][0].minn=a;
} else {
f2[i][0].maxn=f2[i][0].minn=-a;
}
}
for(int i=1; i<=m; ++i) {
int a;
scanf("%d",&a);
f3[i][0].maxn=f3[i][0].minn=a;
}
for(int j=1; j<=29; ++j) {
for(int i=1; i+(1<<j)-1<=n; ++i) {
f1[i][j].maxn=max(f1[i][j-1].maxn,f1[i+(1<<(j-1))][j-1].maxn);
f1[i][j].minn=min(f1[i][j-1].minn,f1[i+(1<<(j-1))][j-1].minn);
f2[i][j].maxn=max(f2[i][j-1].maxn,f2[i+(1<<(j-1))][j-1].maxn);
f2[i][j].minn=min(f2[i][j-1].minn,f2[i+(1<<(j-1))][j-1].minn);
}
}
for(int j=1; j<=29; ++j) {
for(int i=1; i+(1<<j)-1<=m; ++i) {
f3[i][j].maxn=max(f3[i][j-1].maxn,f3[i+(1<<(j-1))][j-1].maxn);
f3[i][j].minn=min(f3[i][j-1].minn,f3[i+(1<<(j-1))][j-1].minn);
}
}
while(q--) {
int l1,r1,l2,r2;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
if(query2(l2,r2,1)<0) {
if(query2(l2,r2,0)>=0){
printf("%lld\n",max(1ll*query1(l1,r1,1,0)*query2(l2,r2,1),1ll*(-query1(l1,r1,1,1))*query2(l2,r2,0)));
}
else {
if(query1(l1,r1,0,1)==-0x3f3f3f3f)
printf("%lld\n",1ll*(query1(l1,r1,1,0))*query2(l2,r2,1));
else
printf("%lld\n",1ll*(-query1(l1,r1,0,1))*query2(l2,r2,0));
}
} else {
if(query1(l1,r1,0,0)==-0x3f3f3f3f)
printf("%lld\n",1ll*(-query1(l1,r1,1,1))*query2(l2,r2,0));
else
printf("%lld\n",1ll*query1(l1,r1,0,0)*query2(l2,r2,1));
}
}
return 0;
}