45分求助,悬赏关注
查看原帖
45分求助,悬赏关注
228745
AllenKING_RED楼主2022/11/17 23:05
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e7+20;
int a[N][2];
struct node{
	int l;
	int r;
	int upm;
	int dom;
	int mxx;
	int mnn;
}tr[N][2];
void push_up(int u,int num)
{
	tr[u][num].dom=max(tr[u<<1][num].dom,tr[u<<1|1][num].dom);
	tr[u][num].mxx=max(tr[u<<1][num].mxx,tr[u<<1|1][num].mxx);
	tr[u][num].mnn=min(tr[u<<1][num].mnn,tr[u<<1|1][num].mnn);
	tr[u][num].upm=min(tr[u<<1][num].upm,tr[u<<1|1][num].upm);
}
void build(int u,int l,int r,int num)
{
	tr[u][num].l=l;
	tr[u][num].r=r;
	if(l==r)
	{
		tr[u][num].mxx=tr[u][num].mnn=a[l][num];
		if(a[l][num]>=0)tr[u][num].dom=-0x3f3f3f3f,tr[u][num].upm=a[l][num];
		else if(a[l][num]<=0)tr[u][num].upm=0x3f3f3f3f,tr[u][num].dom=a[l][num];
		return ;
	}
	int mid=l+r>>1;
	build(u<<1,l,mid,num);
	build(u<<1|1,mid+1,r,num);
	push_up(u,num);
}
int query1(int u,int l,int r,int num)
{
	if(tr[u][num].l>=l&&tr[u][num].r<=r)return tr[u][num].upm;
	else
	{
		int mid=tr[u][num].l+tr[u][num].r>>1;
		int ans=0x3f3f3f3f;
		if(l<=mid)ans=min(ans,query1(u<<1,l,r,num));
		if(r>mid)ans=min(ans,query1(u<<1|1,l,r,num));
		return ans;
	}
}
int query2(int u,int l,int r,int num)
{
	if(tr[u][num].l>=l&&tr[u][num].r<=r)return tr[u][num].dom;
	else
	{
		int mid=tr[u][num].l+tr[u][num].r>>1;
		int ans=-0x3f3f3f3f;
		if(l<=mid)ans=max(ans,query2(u<<1,l,r,num));
		if(r>mid)ans=max(ans,query2(u<<1|1,l,r,num));
		return ans;
	}
}
int query3(int u,int l,int r,int num)
{
	if(tr[u][num].l>=l&&tr[u][num].r<=r)return tr[u][num].mxx;
	else
	{
		int mid=tr[u][num].l+tr[u][num].r>>1;
		int ans=-0x3f3f3f3f;
		if(l<=mid)ans=max(ans,query3(u<<1,l,r,num));
		if(r>mid)ans=max(ans,query3(u<<1|1,l,r,num));
		return ans;
	}
}
int query4(int u,int l,int r,int num)
{
	if(tr[u][num].l>=l&&tr[u][num].r<=r)return tr[u][num].mnn;
	else
	{
		int mid=tr[u][num].l+tr[u][num].r>>1;
		int ans=0x3f3f3f3f;
		if(l<=mid)ans=min(ans,query4(u<<1,l,r,num));
		if(r>mid)ans=min(ans,query4(u<<1|1,l,r,num));
		return ans;
	}
}
int n,m,q;
signed main(void)
{
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)
		cin>>a[i][0];
	for(int j=1;j<=m;j++)
		cin>>a[j][1];
	build(1,1,n,0);
	build(1,1,m,1);
	while(q--)
	{
		int l1,r1,l2,r2;
		cin>>l1>>r1>>l2>>r2;
		int ans1=query3(1,l1,r1,0)*query4(1,l2,r2,1);
		int ans4=query3(1,l1,r1,0)*query3(1,l2,r2,1);
		int ans2=query4(1,l1,r1,0)*query3(1,l2,r2,1);
		int ans3=query4(1,l1,r1,0)*query4(1,l2,r2,1);
		int ans5=query1(1,l1,r1,0)*query4(1,l2,r2,1);
		if(ans5>0x3f3f3f3f)ans5=-ans5;
		int ans6=query2(1,l1,r1,0)*query3(1,l2,r2,1);
		if(ans6>0x3f3f3f3f)ans6=-ans6;
		cout<<max(min(ans1,ans4),max(min(ans2,ans3),max(min(ans1,ans4),max(ans5,ans6))))<<endl;
	}
	return 0;
}
2022/11/17 23:05
加载中...