参考思路
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define int ll
const int maxn=1e5+10;
const int inf=1e12;
int n,m,t,ans;
int sta[maxn][31][2],stb[maxn][31][2],st[maxn][31][3],a[maxn],b[maxn];
bool flag1=1,flag2=1;
inline int read() {
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')w=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
inline void write(int x) {
if(x<0) putchar('-'),x=-x;
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline void rmqa() {
for(int i=1;i<=n;++i)
sta[i][0][0]=sta[i][0][1]=a[i];
for(int i=1;(1<<i)<=n;++i)
for(int j=1;j+(1<<i)-1<=n;++j) {
sta[j][i][0]=max(sta[j][i-1][0],sta[j+(1<<(i-1))][i-1][0]);
sta[j][i][1]=min(sta[j][i-1][1],sta[j+(1<<(i-1))][i-1][1]);
}
}
inline void rmq() {
for(int i=1;i<=n;++i)
st[i][0][0]=a[i]>=0?a[i]:inf;
for(int i=1;(1<<i)<=n;++i)
for(int j=1;j+(1<<i)-1<=n;++j)
st[j][i][0]=min(st[j][i-1][0],st[j+(1<<(i-1))][i-1][0]);
for(int i=1;i<=n;++i)
st[i][0][1]=a[i]<0?a[i]:-inf;
for(int i=1;(1<<i)<=n;++i)
for(int j=1;j+(1<<i)-1<=n;++j)
st[j][i][1]=max(st[j][i-1][1],st[j+(1<<(i-1))][i-1][1]);
}
inline int query(int x,int y,int tmp) {
int k=(int)(log(y-x+1)/log(2));
if(tmp==0) return min(st[x][k][0],st[y-(1<<k)+1][k][0]);
else return max(st[x][k][1],st[y-(1<<k)+1][k][1]);
}
inline void rmqb() {
for(int i=1;i<=m;++i)
stb[i][0][0]=stb[i][0][1]=b[i];
for(int i=1;(1<<i)<=m;++i)
for(int j=1;j+(1<<i)-1<=m;++j) {
stb[j][i][0]=max(stb[j][i-1][0],stb[j+(1<<(i-1))][i-1][0]);
stb[j][i][1]=min(stb[j][i-1][1],stb[j+(1<<(i-1))][i-1][1]);
}
}
inline int querya(int l,int r,int tmp) {
int k=(int)(log(r-l+1)/log(2));
if(tmp==0) return max(sta[l][k][0],sta[r-(1<<k)+1][k][0]);
else return min(sta[l][k][1],sta[r-(1<<k)+1][k][1]);
}
inline int queryb(int l,int r,int tmp) {
int k=(int)(log(r-l+1)/log(2));
if(tmp==0) return max(stb[l][k][0],stb[r-(1<<k)+1][k][0]);
else return min(stb[l][k][1],stb[r-(1<<k)+1][k][1]);
}
signed main() {
n=read(),m=read(),t=read();
for(int i=1;i<=n;++i) {
a[i]=read();
if(a[i]<0) flag1=false;
if(a[i]>0) flag2=false;
}
for(int i=1;i<=m;++i) {
b[i]=read();
if(b[i]<0) flag1=false;
if(b[i]>0) flag2=false;
}
if(flag2) {
for(int i=1;i<=n;++i) a[i]=-a[i];
for(int i=1;i<=m;++i) b[i]=-b[i];
}
rmq(),rmqa(),rmqb();
while(t--) {
int l1=read(),r1=read(),l2=read(),r2=read();
if(flag1||flag2) {
write(querya(l1,r1,0)*queryb(l2,r2,1)),puts("");
continue;
}
if(l1==r1) {
if(a[l1]==0) puts("0");
else if(a[l1]>0) {
write(queryb(l2,r2,1)*a[l1]),puts("");
}
else write(queryb(l2,r2,0)*a[l1]),puts("");
}
else if(l2==r2) {
if(b[l2]==0) puts("0");
else if(b[l2]>0) {
write(querya(l1,r1,0)*b[l2]),puts("");
}
else write(querya(l1,r1,1)*b[l2]),puts("");
}
else {
ans=-inf;
int amax=querya(l1,r1,0),amin=querya(l1,r1,1),azmax=query(l1,r1,0),afmin=query(l1,r1,1),bmax=queryb(l2,r2,0),bmin=queryb(l2,r2,1);
if(amax>=0) ans=max(ans,amax*bmin);
else ans=max(ans,amax*bmax);
if(amin>=0) ans=max(ans,amin*bmin);
else ans=max(ans,amin*bmax);
if(azmax!=inf) ans=max(ans,azmax*bmin);
if(afmin!=inf) ans=max(ans,afmin*bmax);
write(ans),puts("");
}
}
return 0;
}