用的是题解区第一位的方法,两个样例都能过但是爆零
//省略次要代码
int f1[N][20];//xmin
int f2[N][20];//xmax
int f3[N][20];//ymin
int f4[N][20];//ymax
int f5[N][20];//xmin>=0
int f6[N][20];//xmax<0
//省略次要代码
int main()
{
scanf("%d%d%d",&n,&m,&q);
for(int i=2;i<=N;i++)_log2[i]=_log2[i>>1]+1;
for(int i=1;i<=n;i++)
{
scanf("%d",a+i);
f1[i][0]=f2[i][0]=a[i];
if(a[i]>=0)
{
f5[i][0]=a[i];
f6[i][0]=-0x3f3f3f3f;
}
else
{
f5[i][0]=0x3f3f3f3f;
f6[i][0]=a[i];
}
}
for(int i=1;i<=m;i++)
{
scanf("%d",b+i);
f3[i][0]=f4[i][0]=b[i];
}
for(int j=1;j<=20;j++)
{
for(int i=1;i+(1<<j)-1<=n;i++)
{
f1[i][j]=min(f1[i][j-1],f1[i+(1<<(j-1))][j-1]);
f2[i][j]=max(f2[i][j-1],f2[i+(1<<(j-1))][j-1]);
f3[i][j]=min(f3[i][j-1],f3[i+(1<<(j-1))][j-1]);
f4[i][j]=max(f4[i][j-1],f4[i+(1<<(j-1))][j-1]);
f5[i][j]=min(f5[i][j-1],f5[i+(1<<(j-1))][j-1]);
f6[i][j]=max(f6[i][j-1],f6[i+(1<<(j-1))][j-1]);
}
}
int l1,r1,l2,r2,x,y,ans;
// cout<<query1(1,3)<<endl;
while(q--)
{
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
ans=-0x3f3f3f3f;
if(query2(l1,r1)>=0)//xmax
{
y=query3(l2,r2);//ymin
if(y>=0)x=query2(l1,r1);//xmax
else x=query5(l1,r1);//xmin>=0
// printf("%d %d\n",x,y);
ans=max(ans,x*y);
}
if(query1(l1,r1)<0)//xmin
{
y=query4(l2,r2);//ymax
if(y>=0)x=query6(l1,r1);//xmax
else x=query1(l1,r1);//xmin
// printf("%d %d\n",x,y);
ans=max(ans,x*y);
}
printf("%d\n",ans);
}
return 0;
}