数据太水……
错误判断可AC……
#include<bits/stdc++.h>
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
const int N=1e5+5;
int n,m,q,a[N],b[N];
typedef long long ll;
struct node{
ll Max,Min,Max0,Min0;
node (ll Max=0,ll Min=0,ll Max0=0,ll Min0=0):Max(Max),Min(Min),Max0(Max0),Min0(Min0){}
}t1[N<<3],t2[N<<3];
void up1(int rt){
t1[rt].Max=max(t1[ls].Max,t1[rs].Max);
t1[rt].Min=min(t1[ls].Min,t1[rs].Min);
int h1,h2;
h1=t1[ls].Max0,h2=t1[rs].Max0;
if(h1<=0&&h2<=0) t1[rt].Max0=max(h1,h2);
else if(h1>0&&h2>0) t1[rt].Max0=1;
else t1[rt].Max0=(h1<=0?h1:h2);
h1=t1[ls].Min0,h2=t1[rs].Min0;
if(h1>=0&&h2>=0) t1[rt].Min0=min(h1,h2);
else if(h1<0&&h2<0) t1[rt].Min0=-1;
else t1[rt].Min0=(h1>=0?h1:h2);
}
void build1(int rt,int l,int r){
if(l==r){
t1[rt].Min=t1[rt].Max=a[l];
t1[rt].Min0=a[l]>=0?a[l]:-1;
t1[rt].Max0=a[l]<=0?a[l]:1;
return ;
}
int mid=(l+r)>>1;
build1(ls,l,mid);
build1(rs,mid+1,r);
up1(rt);
}
node query1(int rt,int l,int r,int L,int R){
if(l>=L&&r<=R){
return t1[rt];
}
int mid=(l+r)>>1;
node ans,ans1,ans2;
ans1=ans2=ans=node(-1e18,1e18,1,-1);
if(L<=mid) ans1=query1(ls,l,mid,L,R);
if(R>mid) ans2=query1(rs,mid+1,r,L,R);
ans.Max=max(ans1.Max,ans2.Max);
ans.Min=min(ans1.Min,ans2.Min);
int h1,h2;
h1=ans1.Max0,h2=ans2.Max0;
if(h1<=0&&h2<=0) ans.Max0=max(h1,h2);
else if(h1>0&&h2>0) ans.Max0=1;
else ans.Max0=h1<=0?h1:h2;
h1=ans1.Min0,h2=ans2.Min0;
if(h1>=0&&h2>=0) ans.Min0=min(h1,h2);
else if(h1<0&&h2<0) ans.Min0=-1;
else ans.Min0=h1>=0?h1:h2;
return ans;
}
void up2(int rt){
t2[rt].Max=max(t2[ls].Max,t2[rs].Max);
t2[rt].Min=min(t2[ls].Min,t2[rs].Min);
int h1,h2;
h1=t2[ls].Max0,h2=t2[rs].Max0;
if(h1<=0&&h2<=0) t2[rt].Max0=max(h1,h2);
else if(h1>0&&h2>0) t2[rt].Max0=1;
else t2[rt].Max0=h1<=0?h1:h2;
h1=t2[ls].Min0,h2=t2[rs].Min0;
if(h1>=0&&h2>=0) t2[rt].Min0=min(h1,h2);
else if(h1<0&&h2<0) t2[rt].Min0=-1;
else t2[rt].Min0=h1>=0?h1:h2;
}
void build2(int rt,int l,int r){
if(l==r){
t2[rt].Min=t2[rt].Max=b[l];
t2[rt].Min0=b[l]>=0?b[l]:-1;
t2[rt].Max0=b[l]<=0?b[l]:1;
return ;
}
int mid=(l+r)>>1;
build2(ls,l,mid);
build2(rs,mid+1,r);
up2(rt);
}
node query2(int rt,int l,int r,int L,int R){
if(l>=L&&r<=R){
return t2[rt];
}
int mid=(l+r)>>1;
node ans,ans1,ans2;
ans1=ans2=ans=node(-1e18,1e18,1,-1);
if(L<=mid) ans1=query2(ls,l,mid,L,R);
if(R>mid) ans2=query2(rs,mid+1,r,L,R);
ans.Max=max(ans1.Max,ans2.Max);
ans.Min=min(ans1.Min,ans2.Min);
int h1,h2;
h1=ans1.Max0,h2=ans2.Max0;
if(h1<=0&&h2<=0) ans.Max0=max(h1,h2);
else if(h1>0&&h2>0) ans.Max0=1;
else ans.Max0=h1<=0?h1:h2;
h1=ans1.Min0,h2=ans2.Min0;
if(h1>=0&&h2>=0) ans.Min0=min(h1,h2);
else if(h1<0&&h2<0) ans.Min0=-1;
else ans.Min0=h1>=0?h1:h2;
return ans;
}
int main(){
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
build1(1,1,n);
build2(1,1,m);
while(q--){
int l1,r1,l2,r2;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
node md1=query1(1,1,n,l1,r1);
node md2=query2(1,1,m,l2,r2);
// printf("md2.Min=%lld\n",md2.Min);
if(md2.Min>0){
ll ans1=(ll)md1.Max*md2.Max;
ll ans2=(ll)md1.Max*md2.Min;
printf("%lld\n",min(ans1,ans2));
// if(md1.Max<0) printf("%lld\n",ans1);
// else printf("%lld\n",ans2);
}
else if(md2.Max<0){
ll ans1=(ll)md1.Min*md2.Max;
ll ans2=(ll)md1.Min*md2.Min;
printf("%lld\n",min(ans1,ans2));
// if(md1.Min>0) printf("%lld\n",ans2);
// else printf("%lld\n",ans1);
}
else{
ll ans1=md1.Max0*md2.Max;
ll ans2=md1.Min0*md2.Min;
// if(ans1<=0&&ans2<=0) printf("%lld\n",max(ans1,ans2));洛谷上用这个判断可过
// else printf("%lld\n",ans1<=0?ans1:ans2);但在inf oj上会WA,需用下方判断
if(md1.Max0<=0&&md1.Min0>=0) printf("%lld\n",max(ans1,ans2));
else printf("%lld\n",md1.Max0<=0?ans1:ans2);
}
}
return 0;
}