分块35pts求助
查看原帖
分块35pts求助
554584
thlm楼主2023/6/27 22:17
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
#define mn 100010
#define ml 1000
#define minn -0x7f7f7f7f
#define maxx 0x7f7f7f7f
#define ll long long
inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while('0'>ch || ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while('0'<=ch && ch<='9'){
		x=x*10+(ch-'0');
		ch=getchar();
	}
	return x*f;
};
int n,m,q;
ll amiz[ml],amif[ml],amaz[ml],amaf[ml],a[mn],az[mn];
int al[ml],ar[ml],af[mn];
ll bmiz[ml],bmif[ml],bmaz[ml],bmaf[ml],b[mn],bz[mn];
int bl[ml],br[ml],bf[mn];
ll smiz(int l,int r,bool opt){//1Ϊa,0Ϊb 
	ll ans=maxx;
	if(opt){
		if(af[l]==af[r]){
			for(int i=l;i<=r;i++)
				if(a[i]>=0) ans=min(ans,a[i]);
		}else{
			int pn=af[l],pm=af[r];
			for(int i=l;i<=ar[pn];i++)
				if(a[i]>=0) ans=min(ans,a[i]);
			for(int i=r;i>=al[pm];i--)
				if(a[i]>=0) ans=min(ans,a[i]);
			for(int i=pn+1;i<pm;i++)
				if(amiz[i]!=maxx) ans=min(amiz[i],ans);
		}
	}else{
		if(bf[l]==bf[r]){
			for(int i=l;i<=r;i++)
				if(b[i]>=0) ans=min(ans,b[i]);
		}else{
			int pn=bf[l],pm=bf[r];
			for(int i=l;i<=br[pn];i++)
				if(b[i]>=0) ans=min(ans,b[i]);
			for(int i=r;i>=al[pm];i--)
				if(b[i]>=0) ans=min(ans,b[i]);
			for(int i=pn+1;i<pm;i++)
				if(bmiz[i]!=maxx) ans=min(bmiz[i],ans);
		}
	}
	return ans;
};
ll smif(int l,int r,bool opt){//1Ϊa,0Ϊb 
	ll ans=maxx;
	if(opt){
		if(af[l]==af[r]){
			for(int i=l;i<=r;i++)
				if(a[i]<0) ans=min(ans,a[i]);
		}else{
			int pn=af[l],pm=af[r];
			for(int i=l;i<=ar[pn];i++)
				if(a[i]<0) ans=min(ans,a[i]);
			for(int i=r;i>=al[pm];i--)
				if(a[i]<0) ans=min(ans,a[i]);
			for(int i=pn+1;i<pm;i++)
				if(amif[i]!=maxx) ans=min(amif[i],ans);
		}
	}else{
		if(bf[l]==bf[r]){
			for(int i=l;i<=r;i++)
				if(b[i]<0) ans=min(ans,b[i]);
		}else{
			int pn=bf[l],pm=bf[r];
			for(int i=l;i<=br[pn];i++)
				if(b[i]<0) ans=min(ans,b[i]);
			for(int i=r;i>=al[pm];i--)
				if(b[i]<0) ans=min(ans,b[i]);
			for(int i=pn+1;i<pm;i++)
				if(bmif[i]!=maxx) ans=min(bmif[i],ans);
		}
	}
	return ans;
};
ll smaz(int l,int r,bool opt){
	ll ans=minn;
	if(opt){
		if(af[l]==af[r]){
			for(int i=l;i<=r;i++)
				if(a[i]>=0) ans=max(ans,a[i]);
		}else{
			int pn=af[l],pm=af[r];
			for(int i=l;i<=ar[pn];i++)
				if(a[i]>=0) ans=max(ans,a[i]);
			for(int i=al[pm];i<=r;i++)
				if(a[i]>=0) ans=max(ans,a[i]);
			for(int i=pn+1;i<pm;i++){
				if(amaz[i]!=minn) ans=max(ans,amaz[i]);
			}
		}
	}else{
		if(bf[l]==bf[r]){
			for(int i=l;i<=r;i++)
				if(b[i]>=0) ans=max(ans,b[i]);
		}else{
			int pn=bf[l],pm=bf[r];
			for(int i=l;i<=br[pn];i++)
				if(b[i]>=0) ans=max(ans,b[i]);
			for(int i=al[pm];i<=r;i++)
				if(b[i]>=0) ans=max(ans,b[i]);
			for(int i=pn+1;i<pm;i++){
				if(bmaz[i]!=minn) ans=max(ans,bmaz[i]);
			}
		}
	}
	return ans;
};
ll smaf(int l,int r,bool opt){
	ll ans=minn;
	if(opt){
		if(af[l]==af[r]){
			for(int i=l;i<=r;i++)
				if(a[i]<0) ans=max(ans,a[i]);
		}else{
			int pn=af[l],pm=af[r];
			for(int i=l;i<=ar[pn];i++)
				if(a[i]<0) ans=max(ans,a[i]);
			for(int i=al[pm];i<=r;i++)
				if(a[i]<0) ans=max(ans,a[i]);
			for(int i=pn+1;i<pm;i++){
				if(amaf[i]!=minn) ans=max(ans,amaf[i]);
			}
		}
	}else{
		if(bf[l]==bf[r]){
			for(int i=l;i<=r;i++)
				if(b[i]<0) ans=max(ans,b[i]);
		}else{
			int pn=bf[l],pm=bf[r];
			for(int i=l;i<=br[pn];i++)
				if(b[i]<0) ans=max(ans,b[i]);
			for(int i=al[pm];i<=r;i++)
				if(b[i]<0) ans=max(ans,b[i]);
			for(int i=pn+1;i<pm;i++){
				if(bmaf[i]!=minn) ans=max(ans,bmaf[i]);
			}
		}
	}
	return ans;
};
int main(){
	freopen("1.in","r",stdin);
	freopen("1.out","w",stdout);
	n=read();m=read();q=read();
	int tn=(int)sqrt(n),tm=(int)sqrt(m);
	int xn=0;
	for(int i=1;i<=n;i++){
		a[i]=read();
		if(i%tn==1){
			xn++;al[xn]=i;amiz[xn]=maxx;amif[xn]=maxx;
			amaz[xn]=minn;amaf[xn]=minn;
		}
		ar[xn]=i;af[i]=xn;
		if(a[i]>=0){
			amaz[xn]=max(amaz[xn],a[i]);
			amiz[xn]=min(amiz[xn],a[i]);
		}else{
				amaf[xn]=max(amaf[xn],a[i]);
				amif[xn]=min(amif[xn],a[i]);
		}
	}
	xn=0;
	for(int i=1;i<=m;i++){
		b[i]=read();
		if(i%tm==1){
			xn++;bl[xn]=i;bmiz[xn]=maxx;bmif[xn]=maxx;
			bmaz[xn]=minn;bmaf[xn]=minn;
		}
		br[xn]=i;bf[i]=xn;
		if(b[i]>=0){
			bmaz[xn]=max(bmaz[xn],b[i]);
			bmiz[xn]=min(bmiz[xn],b[i]);
		}else{
				bmaf[xn]=max(bmaf[xn],b[i]);
				bmif[xn]=min(bmif[xn],b[i]);
		}
	}
	for(int i=0;i<q;i++){
		int ln=read(),rn=read(),lm=read(),rm=read();
		ll ans=minn;
		ll amifn,amizn,amafn,amazn;
		ll bmifn,bmizn,bmafn,bmazn;
		amifn=smif(ln,rn,1);amizn=smiz(ln,rn,1);
		amafn=smaf(ln,rn,1);amazn=smaz(ln,rn,1);
		bmifn=smif(lm,rm,0);bmizn=smiz(lm,rm,0);
		bmafn=smaf(lm,rm,0);bmazn=smaz(lm,rm,0);
		if(bmifn==maxx){
			if(amazn==minn) ans=amafn*bmazn;
			else ans=amazn*bmizn;
		}
		if(bmazn==minn){
			if(amifn==maxx) ans=amizn*bmifn;
			else ans=amifn*bmafn;
		}
		if(bmifn!=maxx && bmazn!=minn){
			if(amazn==minn) ans=amafn*bmazn;
			if(amifn==maxx) ans=amizn*bmafn;
			if(amifn!=maxx && amazn!=minn){
				ans=max(amizn*bmifn,amafn*bmazn);
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}
2023/6/27 22:17
加载中...