这个代码能AC,但是关于0的数据可能挂掉,放个hack数据
5 7 1
0 -9 -8 -8 -7
10 -1 -7 3 3 -1 -3
1 5 1 7
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,q,l1,l2,r1,r2,u1,u2,v1,v2,v3,v4;
const int N=1e6+5;
int a[N],b[N];
int Amx[N],Ami[N],Apmi[N],Anmx[N];//A-->max,min,正数min,负数max
int Bmx[N],Bmi[N];//B-->max,min
void upd1(int rt)
{
Amx[rt]=max(Amx[rt*2],Amx[rt*2+1]);
Anmx[rt]=max(Anmx[rt*2],Anmx[rt*2+1]);
Ami[rt]=min(Ami[rt*2],Ami[rt*2+1]);
Apmi[rt]=min(Apmi[rt*2],Apmi[rt*2+1]);
}
void upd2(int rt)
{
Bmx[rt]=max(Bmx[rt*2],Bmx[rt*2+1]);
Bmi[rt]=min(Bmi[rt*2],Bmi[rt*2+1]);
}
void build1(int l,int r,int rt)
{
if(l==r)
{
Amx[rt]=Ami[rt]=a[l];
if(a[l]>=0)Apmi[rt]=a[l],Anmx[rt]=-1e9;
else Anmx[rt]=a[l],Apmi[rt]=1e9;
return ;
}
int mid=l+r>>1;
build1(l,mid,rt*2);
build1(mid+1,r,rt*2+1);
upd1(rt);
}
void build2(int l,int r,int rt)
{
if(l==r)
{
Bmi[rt]=Bmx[rt]=b[l];
return ;
}
int mid=l+r>>1;
build2(l,mid,rt*2);
build2(mid+1,r,rt*2+1);
upd2(rt);
}
int AQmi(int x,int y,int l,int r,int rt)
{
int ans=1e9;
if(x<=l&&r<=y)
{
return Ami[rt];
}
int mid=l+r>>1;
if(x<=mid) ans=min(ans,AQmi(x,y,l,mid,rt*2));
if(y>mid) ans=min(ans,AQmi(x,y,mid+1,r,rt*2+1));
return ans;
}
int AQmx(int x,int y,int l,int r,int rt)
{
int ans=-1e9;
if(x<=l&&r<=y)
{
return Amx[rt];
}
int mid=l+r>>1;
if(x<=mid) ans=max(ans,AQmx(x,y,l,mid,rt*2));
if(y>mid) ans=max(ans,AQmx(x,y,mid+1,r,rt*2+1));
return ans;
}
int AQpmi(int x,int y,int l,int r,int rt)
{
int ans=1e9;
if(x<=l&&r<=y)
{
return Apmi[rt];
}
int mid=l+r>>1;
if(x<=mid) ans=min(ans,AQpmi(x,y,l,mid,rt*2));
if(y>mid) ans=min(ans,AQpmi(x,y,mid+1,r,rt*2+1));
return ans;
}
int AQnmx(int x,int y,int l,int r,int rt)
{
int ans=-1e9;
if(x<=l&&r<=y)
{
return Anmx[rt];
}
int mid=l+r>>1;
if(x<=mid) ans=max(ans,AQnmx(x,y,l,mid,rt*2));
if(y>mid) ans=max(ans,AQnmx(x,y,mid+1,r,rt*2+1));
return ans;
}
int BQmi(int x,int y,int l,int r,int rt)
{
int ans=1e9;
if(x<=l&&r<=y)
{
return Bmi[rt];
}
int mid=l+r>>1;
if(x<=mid) ans=min(ans,BQmi(x,y,l,mid,rt*2));
if(y>mid) ans=min(ans,BQmi(x,y,mid+1,r,rt*2+1));
return ans;
}
int BQmx(int x,int y,int l,int r,int rt)
{
int ans=-1e9;
if(x<=l&&r<=y)
{
return Bmx[rt];
}
int mid=l+r>>1;
if(x<=mid) ans=max(ans,BQmx(x,y,l,mid,rt*2));
if(y>mid) ans=max(ans,BQmx(x,y,mid+1,r,rt*2+1));
return ans;
}
int got()
{
if(u2>=0)
{
if(v1>=0)return v1*u2;
else return v3*u1;
}
else if(u1<=0)
{
if(v2<=0)return v2*u1;
else return v4*u2;
}
else
{
if(v2>=0)return v4*u2;
else if(v1<=0)return v3*u1;
else return max(v4*u2,v3*u1);
}
}
signed main()
{
cin>>n>>m>>q;
bool p=1;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) cin>>b[i];
build1(1,n,1);
build2(1,m,1);
// for(int i=1;i<=4;i++)cout<<Bmx[i]<<" ho ";
// cout<<endl;
for(int i=1;i<=q;i++)
{
cin>>l1>>l2>>r1>>r2;
u1=BQmx(r1,r2,1,m,1);u2=BQmi(r1,r2,1,m,1);
v1=AQmx(l1,l2,1,n,1);v2=AQmi(l1,l2,1,n,1);
v3=AQnmx(l1,l2,1,n,1);v4=AQpmi(l1,l2,1,n,1);
// cout<<"homo "<<u1<<" "<<u2<<" "<<v1<<" "<<v2<<" "<<v3<<" "<<v4<<endl;
cout<<got()<<endl;
}
return 0;
}