思路:a和b分别建最大值和最小值的ST表,按a的abs也建一个。
悬赏关注+赞博客,谢谢!!!
#include<bits/stdc++.h>
#define int long long
#define N 500005
using namespace std;
int n,m,q,a[N],b[N],aST_min[N][70],aST_max[N][70],bST_min[N][70],bST_max[N][70],aLOG[N],bLOG[N];
int aabs[N][70],babs[N][70];
int l1,r1,l2,r2;
int amin(int x,int y) {
if(abs(x)<abs(y))return x;
else if(abs(x)>abs(y))return y;
else {
if(x<y)return x;
else return y;
}
}
int bmin(int x,int y) {
if(abs(x)<abs(y))return x;
else if(abs(x)>abs(y))return y;
else {
if(x>y)return x;
else return y;
}
}
void abuild_LOG() {
aLOG[0]=-1;
for(int i=1; i<=n; i++)aLOG[i]=aLOG[i>>1]+1;
}
void abuild_ST() {
for(int i=1; i<=n; i++) {
aST_min[i][0]=a[i];
aST_max[i][0]=a[i];
}
for(int lg=1; lg<=aLOG[n]; lg++) {
for(int i=1; i+(1<<lg)-1<=n; i++) {
aST_min[i][lg]=min(aST_min[i][lg-1],aST_min[i+(1<<(lg-1))][lg-1]);
aST_max[i][lg]=max(aST_max[i][lg-1],aST_max[i+(1<<(lg-1))][lg-1]);
}
}
}
int afind_min(int l,int r) {
return min(aST_min[l][aLOG[r-l+1]],aST_min[r-(1<<aLOG[r-l+1])+1][aLOG[r-l+1]]);
}
int afind_max(int l,int r) {
return max(aST_max[l][aLOG[r-l+1]],aST_max[r-(1<<aLOG[r-l+1])+1][aLOG[r-l+1]]);
}
void bbuild_LOG() {
bLOG[0]=-1;
for(int i=1; i<=m; i++)bLOG[i]=bLOG[i>>1]+1;
}
void bbuild_ST() {
for(int i=1; i<=m; i++) {
bST_min[i][0]=b[i];
bST_max[i][0]=b[i];
}
for(int lg=1; lg<=bLOG[m]; lg++) {
for(int i=1; i+(1<<lg)-1<=m; i++) {
bST_min[i][lg]=min(bST_min[i][lg-1],bST_min[i+(1<<(lg-1))][lg-1]);
bST_max[i][lg]=max(bST_max[i][lg-1],bST_max[i+(1<<(lg-1))][lg-1]);
}
}
}
int bfind_min(int l,int r) {
return min(bST_min[l][bLOG[r-l+1]],bST_min[r-(1<<bLOG[r-l+1])+1][bLOG[r-l+1]]);
}
int bfind_max(int l,int r) {
return max(bST_max[l][bLOG[r-l+1]],bST_max[r-(1<<bLOG[r-l+1])+1][bLOG[r-l+1]]);
}
void build_aabs() {
for(int i=1; i<=n; i++)aabs[i][0]=a[i];
for(int lg=1; lg<=aLOG[n]; lg++) {
for(int i=1; i+(1<<lg)-1<=n; i++) {
aabs[i][lg]=amin(aabs[i][lg-1],aabs[i+(1<<(lg-1))][lg-1]);
}
}
}
int aabs_min(int l,int r) {
return amin(aabs[l][aLOG[r-l+1]],aabs[r-(1<<aLOG[r-l+1])+1][aLOG[r-l+1]]);
}
void build_babs() {
for(int i=1; i<=n; i++)babs[i][0]=a[i];
for(int lg=1; lg<=aLOG[n]; lg++) {
for(int i=1; i+(1<<lg)-1<=n; i++) {
babs[i][lg]=bmin(babs[i][lg-1],babs[i+(1<<(lg-1))][lg-1]);
}
}
}
int babs_min(int l,int r) {
return bmin(babs[l][aLOG[r-l+1]],babs[r-(1<<aLOG[r-l+1])+1][aLOG[r-l+1]]);
}
void gai(int &x) {
if(x<=0)x*=bfind_max(l2,r2);
else x*=bfind_min(l2,r2);
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m>>q;
for(int i=1; i<=n; i++)cin>>a[i];
for(int i=1; i<=m; i++)cin>>b[i];
abuild_LOG();
bbuild_LOG();
abuild_ST();
bbuild_ST();
build_aabs();
build_babs();
while(q--) {
cin>>l1>>r1>>l2>>r2;
int x=aabs_min(l1,r1),y=babs_min(l1,r1),x2=afind_min(l1,r1),y2=afind_max(l1,r1);
gai(x),gai(y),gai(x2),gai(y2);
cout<<max(max(x,y),max(x2,y2))<<endl;
}
return 0;
}