40 分求助
查看原帖
40 分求助
413065
xiezheyuan楼主2022/11/8 13:14
#include <bits/stdc++.h>
#define int long long
#define mid ((l+r)>>1)
#define ls (i<<1)
#define rs (i<<1|1)
#define update(kkksc03) {kkksc03=kkksc03*(kkksc03>=0?bminv:bmaxv);}
using namespace std;

int n,m,q;
const int N = 1e5+5;

struct RangedMaximum{
	int maxt[N<<2];
	void pushup(int i){
		maxt[i]=max(maxt[ls],maxt[rs]);
	}
	void Build(int i,int l,int r,int *a){
		if(l==r){
			maxt[i]=a[l];
			return;
		}
		Build(ls,l,mid,a);
		Build(rs,mid+1,r,a);
		pushup(i);
	}
	void build(int *a,int n){
		memset(maxt,0x8f,sizeof(maxt));
		Build(1,1,n,a);
	}
	int Query(int ql,int qr,int i,int l,int r){
		if(ql<=l&&r<=qr){
			return maxt[i];
		}
		int value=-1e9-7;
		if(ql<=mid){
			value=max(value,Query(ql,qr,ls,l,mid));
		}
		if(qr>mid){
			value=max(value,Query(ql,qr,rs,mid+1,r));
		}
		return value;
	}
	int query(int l,int r,int n){
		return Query(l,r,1,1,n);
	}
};

struct RangedMinimum{
	int maxt[N<<2];
	void pushup(int i){
		maxt[i]=min(maxt[ls],maxt[rs]);
	}
	void Build(int i,int l,int r,int *a){
		if(l==r){
			maxt[i]=a[l];
			return;
		}
		Build(ls,l,mid,a);
		Build(rs,mid+1,r,a);
		pushup(i);
	}
	void build(int *a,int n){
		memset(maxt,0x3f,sizeof(maxt));
		Build(1,1,n,a);
	}
	int Query(int ql,int qr,int i,int l,int r){
		if(ql<=l&&r<=qr){
			return maxt[i];
		}
		int value=1e9+7;
		if(ql<=mid){
			value=min(value,Query(ql,qr,ls,l,mid));
		}
		if(qr>mid){
			value=min(value,Query(ql,qr,rs,mid+1,r));
		}
		return value;
	}
	int query(int l,int r,int n){
		return Query(l,r,1,1,n);
	}
};

RangedMaximum amax,bmax,anmax;
RangedMinimum amin,apmin,bmin;

int a[N],b[N],ap[N],an[N];

signed main(){
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		an[i]=ap[i]=a[i];
		if(a[i]>=0)an[i]=-1e9-7;
		else ap[i]=1e9+7;
	}
	for(int i=1;i<=m;i++){
		cin>>b[i];
	}
	amax.build(a,n);
	amin.build(a,n);
	bmax.build(b,m);
	anmax.build(an,n);
	apmin.build(ap,n);
	bmin.build(b,m);
	while(q--){
		int l1,r1,l2,r2;
		cin>>l1>>r1>>l2>>r2;
		int amaxv=amax.query(l1,r1,n);
		int aminxv=amin.query(l1,r1,n);
		int anmaxv=anmax.query(l1,r1,n);
		int apminv=apmin.query(l1,r1,n);
		int bmaxv=bmax.query(l2,r2,m);
		int bminv=bmin.query(l2,r2,m);
//		cout<<apminv<<' '<<anmaxv<<' ';
		update(amaxv);
		update(aminxv);
		update(anmaxv);
		update(apminv);
		cout<<max({amaxv,aminxv,anmaxv,apminv})<<'\n';
	}
	return 0;
}
2022/11/8 13:14
加载中...