ST 表全 RE
查看原帖
ST 表全 RE
793625
Pink_Cut_Tree楼主2024/3/28 17:13
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5,LOGN=19;
int n,m,q;
int a[N],b[N];
int l1,l2,r1,r2;
int maxa[LOGN][N],maxb[LOGN][N],mina[LOGN][N],minb[LOGN][N];
int lg2[N];
int qrymaxa(int l,int r){
	int t=lg2[r-l+1];
	return max(maxa[t][l],maxa[t][r-(1<<t)+1]);
}
int qrymaxb(int l,int r){
	int t=lg2[r-l+1];
	return max(maxb[t][l],maxb[t][r-(1<<t)+1]);
}
int qrymina(int l,int r){
	int t=lg2[r-l+1];
	return min(mina[t][l],mina[t][r-(1<<t)+1]);
}
int qryminb(int l,int r){
	int t=lg2[r-l+1];
	return min(minb[t][l],minb[t][r-(1<<t)+1]);
}
void init(){
	memset(maxa,-63,sizeof maxa);
	memset(maxb,-63,sizeof maxb);
	memset(mina,63,sizeof mina);
	memset(minb,63,sizeof minb);
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		cin>>b[i];
	}
	for(int i=2;i<=100000;i++){
		lg2[i]=lg2[i>>1]+1;
	}
	for(int i=1;i<=n;i++){
		maxa[0][i]=mina[0][i]=a[i];
	}
	for(int i=1;i<=m;i++){
		maxb[0][i]=minb[0][i]=b[i];
	}
	for(int j=1;j<=lg2[n];j++){
		for(int i=1;i<=n;i++){
			maxa[j][i]=max(maxa[j-1][i],maxa[j-1][i+(1<<(j-1))]);
		}
	}
	for(int j=1;j<=lg2[m];j++){
		for(int i=1;i<=m;i++){
			maxb[j][i]=max(maxb[j-1][i],maxb[j-1][i+(1<<(j-1))]);
		}
	}
	for(int j=1;j<=lg2[m];j++){
		for(int i=1;i<=m;i++){
			minb[j][i]=min(minb[j-1][i],minb[j-1][i+(1<<(j-1))]);
		}
	}
	for(int j=1;j<=lg2[n];j++){
		for(int i=1;i<=n;i++){
			mina[j][i]=min(mina[j-1][i],mina[j-1][i+(1<<(j-1))]);
		}
	}
}
int main(){
	cin.tie(0)->sync_with_stdio(0);
	init();
	while(q--){
		cin>>l1>>l2>>r1>>r2;
		if(qryminb(l2,r2)>=0){
//			cout<<"Q>0\n";
			cout<<qrymaxa(l1,r1)*qryminb(l2,r2)<<"\n";
		}
		else if(qrymaxb(l2,r2)<=0){
//			cout<<"Q<0\n";
			cout<<qrymina(l1,r1)*qrymaxb(l2,r2)<<"\n";
		}
		else{
//			cout<<"Q mix\n";
			cout<<max(qrymaxa(l1,r1)*qryminb(l2,r2),qrymina(l1,r1)*qrymaxb(l2,r2))<<"\n";
		}
	}
return 0;
}
2024/3/28 17:13
加载中...