rt,原来写的和题解不太一样也40pts,改的和最高赞题解差不多也40pts,求助:
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const LL INF=114514191981010086;
const LL MINF=-114514191981010086;
LL n,m,q;
LL a[100001];
LL b[100001];
LL max_a[100001][51];
LL max_b[100001][51];
LL min_a[100001][51];
LL min_b[100001][51];
LL j1_a[100001][51]; // the smallest number in a which is above zero or equals zero
LL j2_a[100001][51]; // the biggest number in a which is below zero
LL lg[100001];
inline LL read()
{
LL x=0,f=1;
char ch=getchar();
while(ch<'0' || ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9')
{
x=x*10+ch-48;
ch=getchar();
}
return x*f;
}
inline LL a_search(LL l,LL r,LL flag)
{
LL len=lg[r-l+1];
if(flag==0)
return max(max_a[l][len],max_a[r-(1<<len)+1][len]);
else if(flag==1)
return min(min_a[l][len],min_a[r-(1<<len)+1][len]);
else if(flag==2)
return min(j1_a[l][len],j1_a[r-(1<<len)+1][len]);
else if(flag==3)
return max(j2_a[l][len],j2_a[r-(1<<len)+1][len]);
}
inline LL b_search(LL l,LL r,LL flag)
{
LL len=lg[r-l+1];
if(flag==0)
return max(max_b[l][len],max_b[r-(1<<len)+1][len]);
else if(flag==1)
return min(min_b[l][len],min_b[r-(1<<len)+1][len]);
}
int main()
{
// freopen("game4.in","r",stdin);
// freopen("game4.out","w",stdout);
LL l1,r1,l2,r2,ans;
LL amax,amin,bmax,bmin,afmax,azmin;
n=read(),m=read(),q=read();
for(LL i=1;i<=n;i++)
{
max_a[i][0]=min_a[i][0]=j1_a[i][0]=j2_a[i][0]=a[i]=read();
if(a[i]<0)
j1_a[i][0]=INF;
else
j2_a[i][0]=MINF;
}
for(LL i=1;i<=m;i++)
max_b[i][0]=min_b[i][0]=b[i]=read();
lg[1]=0;
for(LL i=2;i<=max(m,n);i++)
lg[i]=lg[i>>1]+1;
for(LL j=1;j<=lg[n];j++)
for(LL i=1;i<=n-(1<<j)+1;i++)
{
max_a[i][j]=max(max_a[i][j-1],max_a[i+(1<<(j-1))][j-1]);
min_a[i][j]=min(min_a[i][j-1],min_a[i+(1<<(j-1))][j-1]);
j1_a[i][j]=min(j1_a[i][j-1],j1_a[i+(1<<(j-1))][j-1]);
j2_a[i][j]=max(j2_a[i][j-1],j2_a[i+(1<<(j-1))][j-1]);
}
for(LL j=1;j<=lg[m];j++)
for(LL i=1;i<=m-(1<<j)+1;i++)
{
max_b[i][j]=max(max_b[i][j-1],max_b[i+(1<<(j-1))][j-1]);
min_b[i][j]=min(min_b[i][j-1],min_b[i+(1<<(j-1))][j-1]);
}
for(LL i=1;i<=q;i++)
{
ans=MINF;
l1=read(),r1=read(),l2=read(),r2=read();
amax=a_search(l1,r1,0),amin=a_search(l1,r1,1);
bmax=b_search(l2,r2,0),bmin=b_search(l2,r2,1);
afmax=a_search(l1,r1,3),azmin=a_search(l1,r1,2);
ans=max(ans,amax*(amax>=0?bmin:bmax));
// cout<<"#1 "<<ans<<endl;
ans=max(ans,amin*(amin>=0?bmin:bmax));
// cout<<"#2 "<<ans<<endl;
if(afmax!=MINF)
ans=max(ans,afmax*(afmax>=0?bmin:bmax));
// cout<<"#3 "<<ans<<endl;
if(azmin!=INF)
ans=max(ans,azmin*(azmin>=0?bmin:bmax));
// cout<<"#4 "<<ans<<endl;
cout<<ans<<endl;
}
return 0;
}
qwq