ST表40pts求调
查看原帖
ST表40pts求调
325242
Handsome奥楼主2023/9/2 16:49
#include<bits/stdc++.h>
#define gc getchar
#define LL long long 
using namespace std;
inline int read(){
	char c=gc(),w=0;int x=0;
	while(!isdigit(c))w|=c=='-',c=gc();
	while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=gc(); 
	return w?-x:x;
}
LL max_(LL a,LL b){
	return a>b?a:b;
}
LL min_(LL a,LL b){
	return a<b?a:b;
}
const int Max=100086;
int n,m,q;
int Logn[Max];
LL x_min_feifu[Max][30];
LL x_min[Max][30];
LL x_max_fu[Max][30];
LL x_max[Max][30];
LL y_max[Max][30];
LL y_min[Max][30];
int inf=1e9+5;
int main(){
	n=read(),m=read(),q=read();
	for(int i=1;i<=n;i++){
		int x=read();
		 x_min[i][0]=x_max[i][0]=x;
		 x_max_fu[i][0]=x<=0?x:-inf;
		 x_min_feifu[i][0]=x>=0?x:inf;
	}
	for(int i=1;i<=m;i++)
		y_max[i][0]=y_min[i][0]=read();
	Logn[1]=0;
	Logn[2]=1;
	for(int i=3;i<Max;i++)
		Logn[i]=Logn[i/2]+1;
	for(int j=1;j<=Logn[n];j++){
		for(int i=1;i+(1<<j)-1<=n;i++){
			int tmp=i+(1<<(j-1));
			x_max[i][j]=max_(x_max[i][j-1],x_max[tmp][j-1]);
			x_min[i][j]=min_(x_min[i][j-1],x_min[tmp][j-1]);
			x_max_fu[i][j]=max_(x_max_fu[i][j-1],x_max_fu[tmp][j-1]);
			x_min_feifu[i][j]=min_(x_min_feifu[i][j-1],x_min_feifu[tmp][j-1]);
		}
	}
	for(int j=1;j<=Logn[m];j++){
		for(int i=1;i+(1<<j)-1<=m;i++){
			int tmp=i+(1<<(j-1));
			y_max[i][j]=max_(y_max[i][j-1],y_max[tmp][j-1]);
			y_min[i][j]=min_(y_min[i][j-1],y_min[tmp][j-1]);
		}
	}
	while(q--){
		LL ans1=-inf,ans2=-inf,ans3=-inf,ans4=-inf;
		int l1=read(),r1=read(),l2=read(),r2=read();
		LL s=Logn[r2-l2+1];
		LL y_max_now=max_(y_max[l2][s],y_max[r2-(1<<s)+1][s]);
		LL y_min_now=min_(y_min[l2][s],y_min[r2-(1<<s)+1][s]);
		s=Logn[r1-l1+1];
		LL a;
		a=max_(x_max[l1][s],x_max[r1-(1<<s)+1][s]);
		if(a!=-inf) ans1=a>=0?y_min_now*a:y_max_now*a;
		a=min_(x_min[l1][s],x_min[r1-(1<<s)+1][s]);
		if(a!=inf) ans2=a>=0?y_min_now*a:y_max_now*a;
		a=max_(x_max_fu[l1][s],x_max_fu[r1-(1<<s)+1][s]);
		if(a!=-inf) ans3=a>=0?y_min_now*a:y_max_now*a;
		a=min_(x_min_feifu[l1][s],x_min_feifu[r1-(1<<s)+1][s]);
		if(a!=inf) ans4=a>=0?y_min_now*a:y_max_now*a;
		LL maxx=max_(max_(ans1,ans2),max_(ans3,ans4));
		cout<<maxx<<"\n";
	}
}
2023/9/2 16:49
加载中...