评测记录
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int n,m,q,l1,r1,l2,r2,max1,min1,max2,min2,ans;
int a[N],b[N];
struct node
{
int l,r,minn,maxn,delta1,delta2;
}t1[30*N],t2[30*N];
void build1(int p,int l,int r)
{
t1[p].l=l,t1[p].r=r;
if(l==r)
{
if(a[l]>=0)
{
t1[p].maxn=a[l];
t1[p].minn=LONG_LONG_MIN;
}
else
{
t1[p].minn=a[l];
t1[p].maxn=LONG_LONG_MAX;
}
t1[p].delta1=t1[p].delta2=a[l];
return;
}
int mid=l+r>>1;
build1(p*2,l,mid);
build1(p*2+1,mid+1,r);
t1[p].minn=max(t1[p*2].minn,t1[p*2+1].minn);
t1[p].maxn=min(t1[p*2].maxn,t1[p*2+1].maxn);
t1[p].delta1=max(t1[p*2].delta1,t1[p*2+1].delta1);
t1[p].delta2=min(t1[p*2].delta2,t1[p*2+1].delta2);
return;
}
void build2(int p,int l,int r)
{
t2[p].l=l,t2[p].r=r;
if(l==r)
{
t2[p].maxn=t2[p].minn=b[l];
return;
}
int mid=l+r>>1;
build2(p*2,l,mid);
build2(p*2+1,mid+1,r);
t2[p].minn=min(t2[p*2].minn,t2[p*2+1].minn);
t2[p].maxn=max(t2[p*2].maxn,t2[p*2+1].maxn);
return;
}
int query1_max(int p,int l,int r)
{
if(l<=t1[p].l&&t1[p].r<=r)return t1[p].maxn;
int mid=t1[p].l+t1[p].r>>1,ans=LONG_LONG_MAX;
if(l<=mid)ans=min(ans,query1_max(p*2,l,r));
if(mid<r)ans=min(ans,query1_max(p*2+1,l,r));
return ans;
}
int query1_min(int p,int l,int r)
{
if(l<=t1[p].l&&t1[p].r<=r)return t1[p].minn;
int mid=t1[p].l+t1[p].r>>1,ans=LONG_LONG_MIN;
if(l<=mid)ans=max(ans,query1_min(p*2,l,r));
if(mid<r)ans=max(ans,query1_min(p*2+1,l,r));
return ans;
}
int query2_max(int p,int l,int r)
{
if(l<=t2[p].l&&t2[p].r<=r)return t2[p].maxn;
int mid=t2[p].l+t2[p].r>>1,ans=LONG_LONG_MIN;
if(l<=mid)ans=max(ans,query2_max(p*2,l,r));
if(mid<r)ans=max(ans,query2_max(p*2+1,l,r));
return ans;
}
int query2_min(int p,int l,int r)
{
if(l<=t2[p].l&&t2[p].r<=r)return t2[p].minn;
int mid=t2[p].l+t2[p].r>>1,ans=LONG_LONG_MAX;
if(l<=mid)ans=min(ans,query2_min(p*2,l,r));
if(mid<r)ans=min(ans,query2_min(p*2+1,l,r));
return ans;
}
int query_delta1(int p,int l,int r)
{
if(l<=t1[p].l&&t1[p].r<=r)return t1[p].delta1;
int mid=t1[p].l+t1[p].r>>1,ans=LONG_LONG_MIN;
if(l<=mid)ans=max(ans,query_delta1(p*2,l,r));
if(mid<r)ans=max(ans,query_delta1(p*2+1,l,r));
return ans;
}
int query_delta2(int p,int l,int r)
{
if(l<=t1[p].l&&t1[p].r<=r)return t1[p].delta2;
int mid=t1[p].l+t1[p].r>>1,ans=LONG_LONG_MAX;
if(l<=mid)ans=min(ans,query_delta2(p*2,l,r));
if(mid<r)ans=min(ans,query_delta2(p*2+1,l,r));
return ans;
}
signed main()
{
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
build1(1,1,n);
for(int i=1;i<=m;i++)
cin>>b[i];
build2(1,1,m);
while(q--)
{
cin>>l1>>r1>>l2>>r2;
max1=query1_max(1,l1,r1);
min1=query1_min(1,l1,r1);
max2=query2_max(1,l2,r2);
min2=query2_min(1,l2,r2);
if(min2>0)
{
int sum=query_delta1(1,l1,r1);
if(sum<0)ans=max2*sum;
else ans=min2*sum;
}
else if(max2<0)
{
int sum=query_delta2(1,l1,r1);
if(sum>0)ans=min2*sum;
else ans=max2*sum;
}
else ans=max(max1*min2,min1*max2);
cout<<ans<<endl;
}
return 0;
}