先提前辛苦各位,爱你,么么哒【比心】
//用6个ST表
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+5,nlo=25,inf=LONG_LONG_MAX,tinf=LONG_LONG_MIN;
int n,m,q,lo[N],amax[nlo][N],amin[nlo][N],bmax[nlo][N],bmin[nlo][N];
// a最大值 a最小值 b最大值 b最小值
int famax[nlo][N],zamin[nlo][N];
// 负数中a最大值 正数(包括0)中a最小值
int main(){
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
amax[0][i]=amin[0][i]=x;
if(x>=0){
famax[0][i]=tinf;
zamin[0][i]=x;
}
else{
famax[0][i]=x;
zamin[0][i]=inf;
}
}
for(int i=1;i<=m;i++){
int x;
scanf("%d",&x);
bmax[0][i]=bmin[0][i]=x;
}
lo[0]=-1;
for(int i=1;i<=nlo;i++)
lo[i]=lo[i>>1]+1;
for(int i=1;i<=lo[n];i++)
for(int j=1;j+(1<<i)-1<=n;j++){
amax[i][j]=max(amax[i-1][j],amax[i-1][j+(1<<i-1)]);
amin[i][j]=min(amin[i-1][j],amin[i-1][j+(1<<i-1)]);
famax[i][j]=max(famax[i-1][j],famax[i-1][j+(1<<i-1)]);
zamin[i][j]=min(zamin[i-1][j],zamin[i-1][j+(1<<i-1)]);
}
for(int i=1;i<=lo[m];i++)
for(int j=1;j+(1<<i)-1<=m;j++){
bmax[i][j]=max(bmax[i-1][j],bmax[i-1][j+(1<<i-1)]);
bmin[i][j]=min(bmin[i-1][j],bmin[i-1][j+(1<<i-1)]);
}
while(q--){
int a1,a2,b1,b2;
scanf("%d%d%d%d",&a1,&a2,&b1,&b2);
int s1=lo[a2-a1+1],s2=lo[b2-b1+1];
ll ans1=0,ans2=0;
ll xb=min(bmin[s2][b1],bmin[s2][b2-(1<<s2)+1]);
// 最小b
ll db=max(bmax[s2][b1],bmax[s2][b2-(1<<s2)+1]);
// 最大b
ll xa=min(amin[s1][a1],amin[s1][a2-(1<<s1)+1]);
// 最小a
ll da=max(amax[s1][a1],amax[s1][a2-(1<<s1)+1]);
// 最大a
ll zxa=min(zamin[s1][a1],zamin[s1][a2-(1<<s1)+1]);
// 正数中最小a
ll fda=max(famax[s1][a1],famax[s1][a2-(1<<s1)+1]);
// 负数中最大a
if(xb<0)//如果b的策略是拉低正数a,且b有负数
ans1=xb*zxa;//正数a要尽可能小
else//否则
ans1=xb*da;//正数a尽管大
if(db<0)//如果b的策略是让负数a更负,但b最大也只是负数
ans2=db*xa;//负数a的绝对值就要尽可能的大,然后负负得正
else//否则
ans2=db*fda;//负数a的绝对值就要尽可能的小
printf("%lld\n",max(ans1,ans2));
}
return 0;
}