85pts玄关求条,马蜂良好
查看原帖
85pts玄关求条,马蜂良好
705296
miffy_123楼主2024/11/23 20:03
#include <bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(register int i(l);i^r+1;i=-(~i))
#define per(i,r,l) for(register int i(r);i^l-1;--i)
using namespace std;
const int mx=1e5+5;
int n,m,q,a[mx],b[mx],
f11[mx][21]/*正数最小*/,f12[mx][21]/*正数最大*/,g11[mx][21]/*负数最小*/,g12[mx][21]/*负数最大*/,\
f21[mx][21]/*正数最小*/,f22[mx][21]/*正数最大*/,g21[mx][21]/*负数最小*/,g22[mx][21]/*负数最大*/;
int get_mx(int f[][21],int l,int r){
	int k=log2(r-l+1);
	return max(f[l][k],f[r-(1<<k)+1][k]);
}
int get_mi(int f[][21],int l,int r){
	int k=log2(r-l+1);
	return min(f[l][k],f[r-(1<<k)+1][k]);
}
signed main(){
	cin>>n>>m>>q;
	rep(i,1,n)cin>>a[i];
	rep(i,1,m)cin>>b[i];
	rep(i,1,n)
		if(a[i]>=0)
			f11[i][0]=f12[i][0]=a[i],g11[i][0]=inf,g12[i][0]=-inf;
		else
			g11[i][0]=g12[i][0]=a[i],f11[i][0]=inf,f12[i][0]=-inf;
	rep(i,1,m)
		if(b[i]>=0)
			f21[i][0]=f22[i][0]=b[i],g21[i][0]=inf,g22[i][0]=-inf;
		else
			g21[i][0]=g22[i][0]=b[i],f21[i][0]=inf,f22[i][0]=-inf;
	rep(j,1,20){
		rep(i,1,n){
			if(i+(1<<j)-1<=n){
				f11[i][j]=min(f11[i][j-1],f11[i+(1<<j-1)][j-1]);
				f12[i][j]=max(f12[i][j-1],f12[i+(1<<j-1)][j-1]);
				g11[i][j]=min(g11[i][j-1],g11[i+(1<<j-1)][j-1]);
				g12[i][j]=max(g12[i][j-1],g12[i+(1<<j-1)][j-1]);
			}
		}
	}
	rep(j,1,20){
		rep(i,1,m){
			if(i+(1<<j)-1<=m){
				f21[i][j]=min(f21[i][j-1],f21[i+(1<<j-1)][j-1]);
				f22[i][j]=max(f22[i][j-1],f22[i+(1<<j-1)][j-1]);
				g21[i][j]=min(g21[i][j-1],g21[i+(1<<j-1)][j-1]);
				g22[i][j]=max(g22[i][j-1],g22[i+(1<<j-1)][j-1]);
			}
		}
	}
	while(q--){
		int l1,r1,l2,r2;
		cin>>l1>>r1>>l2>>r2;
		if(get_mi(g21,l2,r2)==inf){//没负数 
			if(get_mi(f11,l1,r1)==inf){//没正数 
				cout<<get_mx(g12,l1,r1)*get_mx(f22,l2,r2)<<endl;
			}
			else{
				cout<<get_mx(f12,l1,r1)*get_mi(f21,l2,r2)<<endl;
			}
		}
		else if(get_mi(f21,l2,r2)==inf){//没正数
			if(get_mi(g11,l1,r1)==inf){//没负数
				cout<<get_mi(f11,l1,r1)*get_mi(g21,l2,r2)<<endl; 
			}
			else{
				cout<<get_mi(g11,l1,r1)*get_mx(g22,l2,r2)<<endl;
			}
		}
		else{
			cout<<max(get_mi(f11,l1,r1)*get_mi(g21,l2,r2)\
			         ,get_mx(g12,l1,r1)*get_mx(f22,l2,r2))<<endl;
		}
	}
    return 0;
}
//f11[mx][21]:正数最小,f12[mx][21]:正数最大,g11[mx][21]:负数最小,g12[mx][21]:负数最大
//f21[mx][21]:正数最小,f22[mx][21]:正数最大,g21[mx][21]:负数最小,g22[mx][21]:负数最大
/*
3 4 5
1 2 -1
2 -1 10
1 1 2 3
1 1 2 2
1 1 1 3
1 3 3 3
1 2 2 2
*/ 
2024/11/23 20:03
加载中...