山东人想来试试水,结果...WA85pts
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
const LL N=1e5+1,INF=1e18;
LL fa1[N][32],fa2[N][32],fb1[N][32],fb2[N][32],as1[N][32],as2[N][32],lg[N];
//fa1:a->max fa2:a->min fb1:b->max fb2:b->min
//as1:a>=0->min as2:a<0->max
int main()
{
// freopen("game3.in","r",stdin);
// freopen("game3.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n,m,q,l1,r1,l2,r2;
LL a1,a2,b1,b2,s1,s2;
cin>>n>>m>>q;
for (int i=2;i<=max(n,m);i++)
lg[i]=lg[i>>1]+1;//预处理log(n)
for (int i=1;i<=n;i++)
{
cin>>fa1[i][0];
fa2[i][0]=fa1[i][0];
if (fa1[i][0]>=0) as1[i][0]=fa1[i][0],as2[i][0]=-INF;
else as1[i][0]=INF,as2[i][0]=fa1[i][0];
}
for (int i=1;i<=m;i++)
{
cin>>fb1[i][0];
fb2[i][0]=fb1[i][0];
}
for (int j=1;j<=lg[n];j++)//ST表预处理
for (int i=1;i+(1<<j)-1<=n;i++)
{
fa1[i][j]=max(fa1[i][j-1],fa1[i+(1<<(j-1))][j-1]);
fa2[i][j]=min(fa2[i][j-1],fa2[i+(1<<(j-1))][j-1]);
as1[i][j]=min(as1[i][j-1],as1[i+(1<<(j-1))][j-1]);
as2[i][j]=max(as2[i][j-1],as2[i+(1<<(j-1))][j-1]);
}
for (int j=1;j<=lg[m];j++)
for (int i=1;i+(1<<j)-1<=m;i++)
{
fb1[i][j]=max(fb1[i][j-1],fb1[i+(1<<(j-1))][j-1]);
fb2[i][j]=min(fb2[i][j-1],fb2[i+(1<<(j-1))][j-1]);
}
while (q--)
{
cin>>l1>>r1>>l2>>r2;
a1=max(fa1[l1][lg[r1-l1+1]],fa1[r1-(1<<lg[r1-l1+1])+1][lg[r1-l1+1]]);
a2=min(fa2[l1][lg[r1-l1+1]],fa2[r1-(1<<lg[r1-l1+1])+1][lg[r1-l1+1]]);
b1=max(fb1[l2][lg[r2-l2+1]],fb1[r2-(1<<lg[r2-l2+1])+1][lg[r2-l2+1]]);
b2=min(fb2[l2][lg[r2-l2+1]],fb2[r2-(1<<lg[r2-l2+1])+1][lg[r2-l2+1]]);
s1=min(as1[l1][lg[r1-l1+1]],as1[r1-(1<<lg[r1-l1+1])+1][lg[r1-l1+1]]);
s2=max(as2[l1][lg[r1-l1+1]],as2[r1-(1<<lg[r1-l1+1])+1][lg[r1-l1+1]]);
if (a2>=0)//a全部为非负数
{
if (b2>=0) cout<<a1*b2<<"\n";//b全部为非负数
else cout<<a2*b2<<"\n";//b能取负数
}
else if (a1<0)//a全部为负数
{
if (b2>=0) cout<<a1*b1<<"\n";//b全部为非负数
else cout<<a2*b1<<"\n";//b能取负数
}
else//a既能取非负数也能取负数
{
if (b2>=0) cout<<a1*b2<<"\n";//b全部为非负数
else if (b1<=0) cout<<a2*b1<<"\n";//b全部为非正数
else cout<<max(s1*b2,s2*b1)<<"\n";//b既能取非负数也能取负数
}
}
return 0;
}