线段树65pts求调
查看原帖
线段树65pts求调
1232696
zbbfans楼主2024/11/28 11:47
#include<bits/stdc++.h>
#define lc p<<1
#define rc p<<1|1
using namespace std;
const long long N=1e5+10;
inline long long read(){
	long long f=1,k=0;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-f;
		c=getchar();
	}
	while(c>='0'&&c<='9') k=k*10+c-'0',c=getchar();
	return f*k; 
}
inline void print(long long x){	
	if(x<0) putchar('-'),x=-x;
	if(x<10) putchar(x+'0');
	else print(x/10),putchar(x%10+'0');
}
long long n,m,q,l1,r1,l2,r2,a[N],b[N];
struct node{
	long long l,r,zmx,fmx,zmi,fmi;
}tra[N<<2];
struct edge{
	long long l,r,mx,mi;
}trb[N<<2];
inline void pushupa(long long p){
	tra[p].zmx=max(tra[lc].zmx,tra[rc].zmx);
	tra[p].zmi=min(tra[lc].zmi,tra[rc].zmi);
	tra[p].fmx=max(tra[lc].fmx,tra[rc].fmx);
	tra[p].fmi=min(tra[lc].fmi,tra[rc].fmi);
}
inline void pushupb(long long p){
	trb[p].mx=max(trb[lc].mx,trb[rc].mx);
	trb[p].mi=min(trb[lc].mi,trb[rc].mi); 
}
inline void builda(long long p,long long l,long long r){
	if(a[l]>=0) tra[p]={l,r,a[l],a[l],a[l],a[l]};
	else tra[p]={l,r,a[l],a[l],a[l],a[l]};
	if(l==r) return ;
	long long m=l+r>>1;
	builda(lc,l,m);
	builda(rc,m+1,r);
	pushupa(p); 
}
inline void buildb(long long p,long long l,long long r){
	trb[p]={l,r,b[l],b[l]};
	if(l==r) return ;
	long long m=l+r>>1;
	buildb(lc,l,m);
	buildb(rc,m+1,r);
	pushupb(p); 
}
inline long long querya1(long long p,long long x,long long y){//最大非负值 
	if(x<=tra[p].l&&y>=tra[p].r) return tra[p].zmx;
	long long ans=-9e18;
	long long m=tra[p].l+tra[p].r>>1;
	if(x<=m) ans=max(ans,querya1(lc,x,y));
	if(y>m) ans=max(ans,querya1(rc,x,y));
	return ans;
}
inline long long querya2(long long p,long long x,long long y){//最小非负值 
	if(x<=tra[p].l&&y>=tra[p].r) return tra[p].zmi;
	long long ans=9e18;
	long long m=tra[p].l+tra[p].r>>1;
	if(x<=m) ans=min(ans,querya2(lc,x,y));
	if(y>m) ans=min(ans,querya2(rc,x,y));
	return ans;
}
inline long long querya3(long long p,long long x,long long y){//最大负值 
	if(x<=tra[p].l&&y>=tra[p].r) return tra[p].fmx;
	long long ans=-9e18;
	long long m=tra[p].l+tra[p].r>>1;
	if(x<=m) ans=max(ans,querya3(lc,x,y));
	if(y>m) ans=max(ans,querya3(rc,x,y));
	return ans;
}
inline long long querya4(long long p,long long x,long long y){//最小负值 
	if(x<=tra[p].l&&y>=tra[p].r) return tra[p].fmi;
	long long ans=9e18;
	long long m=tra[p].l+tra[p].r>>1;
	if(x<=m) ans=min(ans,querya4(lc,x,y));
	if(y>m) ans=min(ans,querya4(rc,x,y));
	return ans;
}
inline long long queryb1(long long p,long long x,long long y){//最大值 
	if(x<=trb[p].l&&y>=trb[p].r) return trb[p].mx;
	long long ans=-9e18;
	long long m=trb[p].l+trb[p].r>>1;
	if(x<=m) ans=max(ans,queryb1(lc,x,y));
	if(y>m) ans=max(ans,queryb1(rc,x,y));
	return ans;
}
inline long long queryb2(long long p,long long x,long long y){//最小值 
	if(x<=trb[p].l&&y>=trb[p].r) return trb[p].mi;
	long long ans=9e18;
	long long m=trb[p].l+trb[p].r>>1;
	if(x<=m) ans=min(ans,queryb2(lc,x,y));
	if(y>m) ans=min(ans,queryb2(rc,x,y));
	return ans;
}
int main(){
	n=read(),m=read(),q=read();
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=m;i++) b[i]=read();
	builda(1,1,n);buildb(1,1,m);
	while(q--){
		l1=read(),r1=read(),l2=read(),r2=read();
		long long amax=querya1(1,l1,r1);
        long long amin=querya4(1,l1,r1);
        long long afmx=querya3(1,l1,r1);
        long long azmn=querya2(1,l1,r1);
        long long bmax=queryb1(1,l2,r2);
        long long bmin=queryb2(1,l2,r2);
        long long ans=-9e18;
        if(amax>=0) ans=max(ans,amax*bmin);
		else ans=max(ans,amax*bmax);
		if(amin>=0) ans=max(ans,amin*bmin);
		else ans=max(ans,amin*bmax);
		if(afmx!=(long long)-9e18){
			if(afmx>=0) ans=max(ans,afmx*bmin);
			else ans=max(ans,afmx*bmax);
		}
		if(azmn!=(long long)-9e18){
			if(azmn>=0) ans=max(ans,azmn*bmin);
			else ans=max(ans,azmn*bmax);
		}
		print(ans);putchar('\n');
	}
	return 0;
}

2024/11/28 11:47
加载中...