开4个st
f5 f6 q5 q6没用
维护a 最大最小 f1 f3
b 最大最小 f2 f4
然后根据情况讨论
ac 1 2 6 7 8 12 13 14 15
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,m,q,l1,l2,r1,r2,t1,t2;
int f1[N][20],f2[N][20],f3[N][20],f4[N][20],f5[N][20],f6[N][20];
int a[N],b[N];
//a 最大 b 最大
//a 最小 b 最小
//a 中是否有0 b 中是否有0
//第一个大于0 第一个小于0
int fr()
{
int x=0,flag=1;
char ch=getchar();
while(ch<'0' || ch>'9')
{
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
{
x=x*10+(ch-'0');
ch=getchar();
}
return x*flag;
}
int qt1(int lf,int rt) //a最大
{
int li=log2(rt-lf+1);
return max(f1[lf][li],f1[rt-(1<<li)+1][li]);
}
int qt2(int lf,int rt) //a最小
{
int li=log2(rt-lf+1);
return min(f3[lf][li],f3[rt-(1<<li)+1][li]);
}
int qt3(int lf,int rt) //b最大
{
int li=log2(rt-lf+1);
return max(f2[lf][li],f2[rt-(1<<li)+1][li]);
}
int qt4(int lf,int rt) //b最小
{
int li=log2(rt-lf+1);
return min(f4[lf][li],f4[rt-(1<<li)+1][li]);
}
int qt5(int lf,int rt)
{
int li=log2(rt-lf+1);
return max(f5[lf][li],f5[rt-(1<<li)+1][li]);
}
int qt6(int lf,int rt)
{
int li=log2(rt-lf+1);
return max(f6[lf][li],f6[rt-(1<<li)+1][li]);
}
void fw(int x)
{
if(x>9) fw(x/10);
putchar(x%10+'0');
}
bool check(int lf,int rt) //判断区间是否有0
{
t1=1e9+10,t2=-1e9-10;
for(int i=lf;i<=rt;i++)
{
if(!a[i]) return 1;
if(a[i]>0) t1=min(t1,a[i]); //第一个大于0
if(a[i]<0) t2=max(t2,a[i]); //第一个小于0
}
return 0;
}
signed main()
{
cin>>n>>m>>q;
for(int i=1;i<=n;i++) f1[i][0]=fr(),a[i]=f1[i][0];
for(int i=1;i<=m;i++) f2[i][0]=fr(),b[i]=f2[i][0];
for(int k=1;(1<<k)<=n;k++)
for(int i=1;(1<<k)+i-1<=n;i++)
f1[i][k]=max(f1[i][k-1],f1[i+(1<<(k-1))][k-1]);
for(int k=1;(1<<k)<=m;k++)
for(int i=1;(1<<k)+i-1<=m;i++)
f2[i][k]=max(f2[i][k-1],f2[i+(1<<(k-1))][k-1]);
for(int i=1;i<=n;i++) f3[i][0]=f1[i][0];
for(int i=1;i<=m;i++) f4[i][0]=f2[i][0];
for(int k=1;(1<<k)<=n;k++)
for(int i=1;(1<<k)+i-1<=n;i++)
f3[i][k]=min(f3[i][k-1],f3[i+(1<<(k-1))][k-1]);
for(int k=1;(1<<k)<=m;k++)
for(int i=1;(1<<k)+i-1<=m;i++)
f4[i][k]=min(f4[i][k-1],f4[i+(1<<(k-1))][k-1]);
for(int i=1;i<=n;i++) if(!f1[i][0]) f5[i][0]=1;
for(int i=1;i<=m;i++) if(!f2[i][0]) f6[i][0]=1;
for(int k=1;(1<<k)<=n;k++)
for(int i=1;(1<<k)+i-1<=n;i++)
f5[i][k]=max(f5[i][k-1],f5[i+(1<<(k-1))][k-1]);
for(int k=1;(1<<k)<=m;k++)
for(int i=1;(1<<k)+i-1<=m;i++)
f6[i][k]=max(f6[i][k],f6[i+(1<<(k-1))][k-1]);
while(q--)
{
l1=fr(),r1=fr(),l2=fr(),r2=fr();
int max1=qt1(l1,r1),min1=qt2(l1,l1);
int max2=qt3(l2,r2),min2=qt4(l2,r2);
if(min2>=0)
{
if(max1<0) fw(max1*max2),puts("");
if(max1==0) puts("0");
if(max1>0) fw(max1*min2),puts("");
}
else if(min2<0 && max2>0)
{
if(max1<0) fw(max1*max2),puts("");
if(max1==0) puts("0");
if(max1>0)
{
if(check(l1,r1)) puts("0");
else printf("%lld\n",max(t1*min2,t2*max2));
}
}
else if(min2<0 && max2==0)
{
if(max1<0) puts("0");
if(max1==0) puts("0");
if(max1>0) puts("0");
}
else if(min2<0 && max2<0)
{
if(max1<0) fw(min1*max2),puts("");
if(max1==0) fw(min1*max2),puts("");
if(max1>0) fw(min1*max2),puts("");
}
}
return 0;
}