#include<bits/stdc++.h>
using namespace std;
const int INF=2e9;
const int N=1e5+5;
int n,m,q,a[N],b[N],l1,r1,l2,r2;
int st_A_max[N][20],st_A_min[N][20],st_A_zmin[N][20],st_A_fmax[N][20];
int st_B_max[N][20],st_B_min[N][20];
int Log[N];
inline int query_A_max(int l,int r)
{
int len=Log[r-l+1];
return max(st_A_max[l][len],st_A_max[r-(1<<len)+1][len]);
}
inline int query_A_min(int l,int r)
{
int len=Log[r-l+1];
return min(st_A_min[l][len],st_A_min[r-(1<<len)+1][len]);
}
inline int query_A_fmax(int l,int r)
{
int len=Log[r-l+1];
return max(st_A_fmax[l][len],st_A_fmax[r-(1<<len)+1][len]);
}
inline int query_A_zmin(int l,int r)
{
int len=Log[r-l+1];
return min(st_A_zmin[l][len],st_A_zmin[r-(1<<len)+1][len]);
}
inline int query_B_max(int l,int r)
{
int len=Log[r-l+1];
return max(st_B_max[l][len],st_B_max[r-(1<<len)+1][len]);
}
inline int query_B_min(int l,int r)
{
int len=Log[r-l+1];
return min(st_B_min[l][len],st_B_min[r-(1<<len)+1][len]);
}
int main()
{
clock_t c1=clock();
#ifdef LOCAL
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m>>q;
for(int i=1;i<=n;i++)cin>>a[i],st_A_max[i][0]=st_A_min[i][0]=a[i],st_A_fmax[i][0]=a[i]>=0?-INF:a[i],st_A_zmin[i][0]=a[i]<0?INF:a[i];
for(int i=1;i<=m;i++)cin>>b[i],st_B_max[i][0]=st_B_min[i][0]=b[i];
Log[1]=0;
for(int i=2;i<=N-5;i++)Log[i]=Log[i>>1]+1;
for(int j=1;j<=Log[n];j++)
{
for(int i=1;i+(1<<j)-1<=n;i++)
{
st_A_max[i][j]=max(st_A_max[i][j-1],st_A_max[i+(1<<j-1)][j-1]);
st_A_min[i][j]=min(st_A_min[i][j-1],st_A_min[i+(1<<j-1)][j-1]);
st_A_fmax[i][j]=max(st_A_fmax[i][j-1],st_A_fmax[i+(1<<j-1)][j-1]);
st_A_zmin[i][j]=min(st_A_zmin[i][j-1],st_A_zmin[i+(1<<j-1)][j-1]);
}
}
for(int j=1;j<=Log[m];j++)
{
for(int i=1;i+(1<<j)-1<=m;i++)
{
st_B_max[i][j]=max(st_B_max[i][j-1],st_B_max[i+(1<<j-1)][j-1]);
st_B_min[i][j]=min(st_B_min[i][j-1],st_B_min[i+(1<<j-1)][j-1]);
}
}
while(q--)
{
cin>>l1>>r1>>l2>>r2;
int y1=query_B_min(l2,r2);
int x1=(y1<0)?query_A_zmin(l1,r1):query_A_max(l1,r1);
int y2=query_B_max(l2,r2);
int x2=(y2<0)?query_A_min(l1,r1):query_A_fmax(l1,r1);
cout<<max(1ll*x1*y1,1ll*x2*y2)<<endl;
}
#ifdef LOCAL
cerr<<"Time used:"<<clock()-c1<<"ms";
#endif
return 0;
}
第一篇题解的思路,数组名应该浅显易懂,注:st_A_zmin是非负整数最小值,st_A_fmax是负数最大值