求助st表85分
查看原帖
求助st表85分
304524
崔化博楼主2022/10/29 23:07
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define N 100005
using namespace std;
struct node {
	int minn,maxn;
	node() {
		minn=0x3f3f3f3f;
		maxn=-0x3f3f3f3f;
	}
} f1[N][35],f2[N][35],f3[N][35];
//f1正数
int n,m,q;
int query1(int l,int r,int p,int q) { //p表示最大或最小 q正负
	int k=log2(r-l+1);
	if(!q) {
		if(!p)
			return max(f1[l][k].maxn,f1[r-(1<<k)+1][k].maxn);
		return min(f1[l][k].minn,f1[r-(1<<k)+1][k].minn);
	}
	if(!p)
		return max(f2[l][k].maxn,f2[r-(1<<k)+1][k].maxn);
	return min(f2[l][k].minn,f2[r-(1<<k)+1][k].minn);
}
int query2(int l,int r,int p) { //p最大最小
	int k=log2(r-l+1);
	if(!p)
		return max(f3[l][k].maxn,f3[r-(1<<k)+1][k].maxn);
	return min(f3[l][k].minn,f3[r-(1<<k)+1][k].minn);
}
int main() {
//	freopen("game.in","r",stdin);
//	freopen("game.out","w",stdout);
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1; i<=n; ++i) {
		int a;
		scanf("%d",&a);
		if(a>=0) {
			f1[i][0].maxn=f1[i][0].minn=a;
		} else {
			f2[i][0].maxn=f2[i][0].minn=-a;
		}
	}
	for(int i=1; i<=m; ++i) {
		int a;
		scanf("%d",&a);
		f3[i][0].maxn=f3[i][0].minn=a;
	}
	for(int j=1; j<=29; ++j) {
		for(int i=1; i+(1<<j)-1<=n; ++i) {
			f1[i][j].maxn=max(f1[i][j-1].maxn,f1[i+(1<<(j-1))][j-1].maxn);
			f1[i][j].minn=min(f1[i][j-1].minn,f1[i+(1<<(j-1))][j-1].minn);
			f2[i][j].maxn=max(f2[i][j-1].maxn,f2[i+(1<<(j-1))][j-1].maxn);
			f2[i][j].minn=min(f2[i][j-1].minn,f2[i+(1<<(j-1))][j-1].minn);
		}
	}
	for(int j=1; j<=29; ++j) {
		for(int i=1; i+(1<<j)-1<=m; ++i) {
			f3[i][j].maxn=max(f3[i][j-1].maxn,f3[i+(1<<(j-1))][j-1].maxn);
			f3[i][j].minn=min(f3[i][j-1].minn,f3[i+(1<<(j-1))][j-1].minn);
		}
	}
	while(q--) {
		int l1,r1,l2,r2;
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		if(query2(l2,r2,1)<0) {
			if(query2(l2,r2,0)>=0){
			
				printf("%lld\n",max(1ll*query1(l1,r1,1,0)*query2(l2,r2,1),1ll*(-query1(l1,r1,1,1))*query2(l2,r2,0)));
			}
			else {
				if(query1(l1,r1,0,1)==-0x3f3f3f3f)
					printf("%lld\n",1ll*(query1(l1,r1,1,0))*query2(l2,r2,1));
				else
					printf("%lld\n",1ll*(-query1(l1,r1,0,1))*query2(l2,r2,0));
			}
		} else {
			if(query1(l1,r1,0,0)==-0x3f3f3f3f)
				printf("%lld\n",1ll*(-query1(l1,r1,1,1))*query2(l2,r2,0));
			else
				printf("%lld\n",1ll*query1(l1,r1,0,0)*query2(l2,r2,1));
		}
	}
	return 0;
}
2022/10/29 23:07
加载中...