RE求调
查看原帖
RE求调
1373929
syy999楼主2025/8/31 17:10
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lc (p<<1)
#define rc ((p<<1)|1)
#define mid ((l+r)>>1)
const int inf=1e18+10,N=1e5+10;
int a[N],b[N],a2[N],a3[N],n,q,m;
struct node{
	int l,r,mx,mi,nx,pi;
}tr[N<<2];
struct node2{
	int l,r,mx,mi;
}tr2[N<<2];
inline int rd(){
	int x=1,y=0;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-') x=-x;ch=getchar();}
	while(isdigit(ch)){y=(y<<3)+(y<<1)+(ch^48);ch=getchar();}
	return x*y;
}
inline void w(int x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) w(x/10);putchar(x%10^48);
}
inline void pushup(int p){
	tr[p].mi=min(tr[lc].mi,tr[rc].mi);
	tr[p].mx=max(tr[lc].mx,tr[rc].mx);
	tr[p].nx=max(tr[lc].nx,tr[rc].nx);
	tr[p].pi=min(tr[lc].pi,tr[rc].pi);
}
inline void pushup2(int p){
	tr2[p].mx=max(tr2[lc].mx,tr2[rc].mx);
	tr2[p].mi=min(tr2[lc].mi,tr2[rc].mi);
}
inline void build(int p,int l,int r){
	tr[p]=node{l,r,a[l],a[l],a2[l],a3[l]};
	if(l==r) return;
	build(lc,l,mid);build(rc,mid+1,r);
	pushup(p);
}
inline void build2(int p,int l,int r){
	tr2[p]=node2{l,r,b[l],b[l]};
	if(l==r) return;
	build(lc,l,mid);build(rc,mid+1,r);
	pushup2(p);
}
inline int query(int p,int x,int y){
	int l=tr[p].l,r=tr[p].r;
	if(x<=l&&r<=y) return tr[p].mx;
	int res=INT_MIN;
	if(x<=mid) res=max(res,query(lc,x,y));
	if(y>mid) res=max(res,query(rc,x,y));
	return res;
}
inline int query2(int p,int x,int y){
	int l=tr[p].l,r=tr[p].r;
	if(x<=l&&r<=y) return tr[p].mi;
	int res=INT_MAX;
	if(x<=mid) res=min(res,query2(lc,x,y));
	if(y>mid) res=min(res,query2(rc,x,y));
	return res;
}
inline int query3(int p,int x,int y){
	int l=tr[p].l,r=tr[p].r;
	if(x<=l&&r<=y) return tr[p].nx;
	int res=INT_MIN;
	if(x<=mid) res=max(res,query3(lc,x,y));
	if(y>mid) res=max(res,query3(rc,x,y));
	return res;
}
inline int query4(int p,int x,int y){
	int l=tr[p].l,r=tr[p].r;
	if(x<=l&&r<=y) return tr[p].pi;
	int res=INT_MAX;
	if(x<=mid) res=min(res,query4(lc,x,y));
	if(y>mid) res=min(res,query4(rc,x,y));
	return res;
}
inline int query5(int p,int x,int y){
	int l=tr2[p].l,r=tr2[p].r;
	if(x<=l&&r<=y) return tr2[p].mx;
	int res=INT_MIN;
	if(x<=mid) res=max(res,query5(lc,x,y));
	if(y>mid) res=max(res,query5(rc,x,y));
	return res;
}
inline int query6(int p,int x,int y){
	int l=tr2[p].l,r=tr2[p].r;
	if(x<=l&&r<=y) return tr2[p].mi;
	int res=INT_MAX;
	if(x<=mid) res=min(res,query6(lc,x,y));
	if(y>mid) res=min(res,query6(rc,x,y));
	return res;
}
inline int duice(int x,int bmx,int bmi){return (x>=0?bmi:bmx);}
signed main(){
	n=rd();m=rd();q=rd();
	for(int i=1;i<=n;i++){
		a[i]=rd();a2[i]=(a[i]>=0?-inf:a[i]);
		a3[i]=(a[i]<0?inf:a[i]);
	}
	for(int i=1;i<=m;i++) b[i]=rd();
	build(1,1,n);build2(1,1,m);
	while(q--){
		int a1=rd(),b1=rd(),c1=rd(),d1=rd();
		int amx=query(1,a1,b1),ami=query2(1,a1,b1),anx=query3(1,a1,b1),api=query4(1,a1,b1),bmx=query5(1,c1,d1),bmi=query6(1,c1,d1),ans=-inf;
		ans=max({ans,amx*duice(amx,bmx,bmi),ami*duice(ami,bmx,bmi)});
		if(anx!=-inf) ans=max(ans,anx*duice(anx,bmx,bmi));
		if(api!=inf) ans=max(ans,api*duice(api,bmx,bmi));
		w(ans);putchar('\n');
	}
	return 0;
}
2025/8/31 17:10
加载中...