lg上AC,InfOJ上WA了,40pts,错的都是没有性质1的点。
#include<bits/stdc++.h>
#define ll long long
#define N 100005
#define Inf 1000000000000000005
using namespace std;
ll read(){
ll x=0,f=1; char c=getchar();
while(c!='-'&&(c<'0'||c>'9')) c=getchar();
if(c=='-') f=-1,c=getchar();
while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=getchar();
return x*f;
}
int n,m,q;
ll a[N];
ll b[N];
struct STree{
int l,r;
ll maxn,minn;
ll zminn,fmaxn;
}ta[N*4],tb[N*4];
int l1,l2,r1,r2;
ll amx,amn,bmx,bmn,azn,afx,ans;
void PushUp(STree tr[],int u,bool type){
tr[u].maxn=max(tr[u<<1].maxn,tr[u<<1|1].maxn);
tr[u].minn=min(tr[u<<1].minn,tr[u<<1|1].minn);
if(type){
tr[u].fmaxn=max(tr[u<<1].fmaxn,tr[u<<1|1].fmaxn);
tr[u].zminn=min(tr[u<<1].zminn,tr[u<<1|1].zminn);
}
}
void Build(STree tr[],int u,int l,int r,ll c[],bool type){
tr[u].l=l; tr[u].r=r;
if(l==r){
tr[u].maxn=tr[u].minn=c[l];
if(type){
if(a[l]>0){
tr[u].zminn=a[l];
tr[u].fmaxn=-Inf;
}
else if(a[l]<0){
tr[u].zminn=Inf;
tr[u].fmaxn=a[l];
}
else if(a[l]==0){
tr[u].zminn=a[l];
tr[u].fmaxn=a[l];
}
}
return ;
}
int mid=l+r>>1;
Build(tr,u<<1,l,mid,c,type);
Build(tr,u<<1|1,mid+1,r,c,type);
PushUp(tr,u,type);
}
ll QMax(STree tr[],int u,int l,int r,ll c[],int L,int R){
if(L<=l&&r<=R) return tr[u].maxn;
int mid=l+r>>1;
ll mx=-Inf;
if(L<=mid) mx=max(mx,QMax(tr,u<<1,l,mid,c,L,R));
if(R>mid) mx=max(mx,QMax(tr,u<<1|1,mid+1,r,c,L,R));
return mx;
}
ll QMin(STree tr[],int u,int l,int r,ll c[],int L,int R){
if(L<=l&&r<=R) return tr[u].minn;
int mid=l+r>>1;
ll mn=Inf;
if(L<=mid) mn=min(mn,QMin(tr,u<<1,l,mid,c,L,R));
if(R>mid) mn=min(mn,QMin(tr,u<<1|1,mid+1,r,c,L,R));
return mn;
}
ll QFMax(STree tr[],int u,int l,int r,ll c[],int L,int R){
if(L<=l&&r<=R) return tr[u].fmaxn;
int mid=l+r>>1;
ll mx=-Inf;
if(L<=mid) mx=max(mx,QFMax(tr,u<<1,l,mid,c,L,R));
if(R>mid) mx=max(mx,QFMax(tr,u<<1|1,mid+1,r,c,L,R));
return mx;
}
ll QZMin(STree tr[],int u,int l,int r,ll c[],int L,int R){
if(L<=l&&r<=R) return tr[u].zminn;
int mid=l+r>>1;
ll mn=Inf;
if(L<=mid) mn=min(mn,QZMin(tr,u<<1,l,mid,c,L,R));
if(R>mid) mn=min(mn,QZMin(tr,u<<1|1,mid+1,r,c,L,R));
return mn;
}
int main(){
// freopen("game.in","r",stdin);
// freopen("game.out","w",stdout);
n=(int)read(); m=(int)read(); q=(int)read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=m;i++) b[i]=read();
Build(ta,1,1,n,a,1);
Build(tb,1,1,m,b,0);
while(q--){
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
amx=QMax(ta,1,1,n,a,l1,r1);
amn=QMin(ta,1,1,n,a,l1,r1);
bmx=QMax(tb,1,1,m,b,l2,r2);
bmn=QMin(tb,1,1,m,b,l2,r2);
ans=-Inf;
if(bmn>=0) ans=max(ans,amx*bmn);
else if(bmx<=0) ans=max(ans,amn*bmx);
else{
if(amn>=0) ans=max(ans,amn*bmn);
else if(amx<=0) ans=max(ans,amx*bmx);
else{
azn=QZMin(ta,1,1,n,a,l1,r1);
afx=QFMax(ta,1,1,n,a,l1,r1);
ans=max(ans,max(azn*bmn,afx*bmx));
}
}
printf("%lld\n",ans);
}
return 0;
}