调出来了,此贴完
```cpp
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+7;
const int K=1e9+7;
int n,m,q,anss=-(K*K),a[N],b[N];
int f[10],g[10];//分别存a数组和b数组的四个ans的值
struct hhh
{
int l,r,mid,ans1,ans2,ans3,ans4;//ans1是区间最大值 ans2是区间最小值 ans3是区间最大负数 ans4是区间最小正数
} v1[4*N],v2[4*N];
void chu()
{
f[1]=-K; f[2]=K; f[3]=-K; f[4]=K;
g[1]=-K; g[2]=K; g[3]=-K; g[4]=K;
}
void build1(int x,int s,int t)
{
v1[x].l=s; v1[x].r=t; v1[x].mid=(s+t)/2;
if(s==t)
{
v1[x].ans1=a[t];
v1[x].ans2=a[t];
if(a[t]<0) v1[x].ans3=a[t],v1[x].ans4=K;
else v1[x].ans3=-K,v1[x].ans4=a[t];
return ;
}
build1(2*x,s,v1[x].mid);
build1(2*x+1,v1[x].mid+1,t);
v1[x].ans1=max(v1[2*x].ans1,v1[2*x+1].ans1);
v1[x].ans2=min(v1[2*x].ans2,v1[2*x+1].ans2);
v1[x].ans3=max(v1[2*x].ans3,v1[2*x+1].ans3);
v1[x].ans4=min(v1[2*x].ans4,v1[2*x+1].ans4);
}
void build2(int x,int s,int t)
{
v2[x].l=s; v2[x].r=t; v2[x].mid=(s+t)/2;
if(s==t)
{
v2[x].ans1=b[t];
v2[x].ans2=b[t];
if(b[t]<0) v2[x].ans3=b[t],v2[x].ans4=K;
else v2[x].ans3=-K,v2[x].ans4=b[t];
return ;
}
build2(2*x,s,v2[x].mid);
build2(2*x+1,v2[x].mid+1,t);
v2[x].ans1=max(v2[2*x].ans1,v2[2*x+1].ans1);
v2[x].ans2=min(v2[2*x].ans2,v2[2*x+1].ans2);
v2[x].ans3=max(v2[2*x].ans3,v2[2*x+1].ans3);
v2[x].ans4=min(v2[2*x].ans4,v2[2*x+1].ans4);
}
void ask1(int x,int s,int t)
{
if(v1[x].l>=s&&v1[x].r<=t)
{
f[1]=max(v1[x].ans1,f[1]);
f[2]=min(v1[x].ans2,f[2]);
f[3]=max(v1[x].ans3,f[3]);
f[4]=min(v1[x].ans4,f[4]);
return ;
}
if(v1[x].mid>=s) ask1(2*x,s,t);
if(v1[x].mid<t) ask1(2*x+1,s,t);
}
void ask2(int x,int s,int t)
{
if(v2[x].l>=s&&v2[x].r<=t)
{
g[1]=max(v2[x].ans1,g[1]);
g[2]=min(v2[x].ans2,g[2]);
g[3]=max(v2[x].ans3,g[3]);
g[4]=min(v2[x].ans4,g[4]);
return ;
}
if(v2[x].mid>=s) ask2(2*x,s,t);
if(v2[x].mid<t) ask2(2*x+1,s,t);
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
chu();
cin>>n>>m>>q;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) cin>>b[i];
build1(1,1,n);
build2(1,1,m);
for(int i=1;i<=q;i++)
{
int l1,l2,r1,r2;
cin>>l1>>r1>>l2>>r2;
ask1(1,l1,r1);
ask2(1,l2,r2);
for(int j=1;j<=4;j++)
{
int ddd=K*K;
if(f[j]!=K&&f[j]!=-K)
{
for(int k=1;k<=4;k++) if(g[k]!=K&&g[k]!=-K)ddd=min(ddd,f[j]*g[k]);
anss=max(ddd,anss);
}
}
cout<<anss<<'\n';
chu(); anss=-(K*K);
}
return 0;
}
```
by zlinda @ 2023-02-06 21:11:58