分块,样例12过,没过大样例
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,q;
int block_a,num_a,block_b,num_b;
int a[100010],b[100010];
int belong_a[100010],l_a[100010],r_a[100010];
int belong_b[100010],l_b[100010],r_b[100010];
int mmax_a[100010],mmin_a[100010];
int fmmax_a[100010],fmmin_a[100010];
int mmax_b[100010],mmin_b[100010];
void build_a(){
block_a=sqrt(n);
num_a=n/block_a;
if(n%block_a) num_a++;
for(int i=1;i<=n;i++) belong_a[i]=(i-1)/block_a+1;
for(int i=1;i<=num_a;i++){
l_a[i]=block_a*(i-1)+1;
r_a[i]=block_a*i;
}
r_a[num_a]=n;
for(int i=1;i<=num_a;i++) for(int j=l_a[i];j<=r_a[i];j++) mmax_a[i]=max(mmax_a[i],a[j]);
for(int i=1;i<=num_a;i++) for(int j=l_a[i];j<=r_a[i];j++) mmin_a[i]=min(mmin_a[i],a[j]);
for(int i=1;i<=num_a;i++) for(int j=l_a[i];j<=r_a[i];j++) if(a[j]<0) fmmax_a[i]=max(fmmax_a[i],a[j]);
for(int i=1;i<=num_a;i++) for(int j=l_a[i];j<=r_a[i];j++) if(a[j]>=0) fmmin_a[i]=min(fmmin_a[i],a[j]);
}
void build_b(){
block_b=sqrt(m);
num_b=m/block_b;
if(m%block_b) num_b++;
for(int i=1;i<=m;i++) belong_b[i]=(i-1)/block_b+1;
for(int i=1;i<=num_b;i++){
l_b[i]=block_b*(i-1)+1;
r_b[i]=block_b*i;
}
r_b[num_b]=m;
for(int i=1;i<=num_b;i++) for(int j=l_b[i];j<=r_b[i];j++) mmax_b[i]=max(mmax_b[i],b[j]);
for(int i=1;i<=num_b;i++) for(int j=l_b[i];j<=r_b[i];j++) mmin_b[i]=min(mmin_b[i],b[j]);
}
int ask_a_max(int x,int y){
if(belong_a[x]==belong_a[y]){
int ans=LONG_LONG_MIN;
for(int i=x;i<=y;i++) ans=max(ans,a[i]);
return ans;
}
int ans=LONG_LONG_MIN;
for(int i=x;i<=r_a[belong_a[x]];i++) ans=max(ans,a[i]);
for(int i=belong_a[x]+1;i<belong_a[y];i++) ans=max(ans,mmax_a[i]);
for(int i=l_a[belong_a[x]];i<=y;i++) ans=max(ans,a[i]);
return ans;
}
int ask_b_max(int x,int y){
if(belong_b[x]==belong_b[y]){
int ans=LONG_LONG_MIN;
for(int i=x;i<=y;i++) ans=max(ans,b[i]);
return ans;
}
int ans=LONG_LONG_MIN;
for(int i=x;i<=r_b[belong_b[x]];i++) ans=max(ans,b[i]);
for(int i=belong_b[x]+1;i<belong_b[y];i++) ans=max(ans,mmax_b[i]);
for(int i=l_b[belong_b[x]];i<=y;i++) ans=max(ans,b[i]);
return ans;
}
int ask_a_min(int x,int y){
if(belong_a[x]==belong_a[y]){
int ans=LONG_LONG_MAX;
for(int i=x;i<=y;i++) ans=min(ans,a[i]);
return ans;
}
int ans=LONG_LONG_MAX;
for(int i=x;i<=r_a[belong_a[x]];i++) ans=min(ans,a[i]);
for(int i=belong_a[x]+1;i<belong_a[y];i++) ans=min(ans,mmin_a[i]);
for(int i=l_a[belong_a[x]];i<=y;i++) ans=min(ans,a[i]);
return ans;
}
int ask_b_min(int x,int y){
if(belong_b[x]==belong_b[y]){
int ans=LONG_LONG_MAX;
for(int i=x;i<=y;i++) ans=min(ans,b[i]);
return ans;
}
int ans=LONG_LONG_MAX;
for(int i=x;i<=r_b[belong_b[x]];i++) ans=min(ans,b[i]);
for(int i=belong_b[x]+1;i<belong_b[y];i++) ans=min(ans,mmin_b[i]);
for(int i=l_b[belong_b[x]];i<=y;i++) ans=min(ans,b[i]);
return ans;
}
int ask_a_fmax(int x,int y){
if(belong_a[x]==belong_a[y]){
int ans=LONG_LONG_MIN;
for(int i=x;i<=y;i++) if(a[i]<0) ans=max(ans,a[i]);
return ans;
}
int ans=LONG_LONG_MIN;
for(int i=x;i<=r_a[belong_a[x]];i++) if(a[i]<0) ans=max(ans,a[i]);
for(int i=belong_a[x]+1;i<belong_a[y];i++) ans=max(ans,fmmax_a[i]);
for(int i=l_a[belong_a[x]];i<=y;i++) if(a[i]<0) ans=max(ans,a[i]);
return ans;
}
int ask_a_fmin(int x,int y){
if(belong_a[x]==belong_a[y]){
int ans=LONG_LONG_MAX;
for(int i=x;i<=y;i++) if(a[i]>=0) ans=min(ans,a[i]);
return ans;
}
int ans=LONG_LONG_MAX;
for(int i=x;i<=r_a[belong_a[x]];i++) if(a[i]>=0) ans=min(ans,a[i]);
for(int i=belong_a[x]+1;i<belong_a[y];i++) ans=min(ans,fmmin_a[i]);
for(int i=l_a[belong_a[x]];i<=y;i++) if(a[i]>=0) ans=min(ans,a[i]);
return ans;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
// freopen("game4.in","r",stdin);
// freopen("game.out","w",stdout);
cin>>n>>m>>q;
for(int i=1;i<=n;i++){
mmin_a[i]=LONG_LONG_MAX;
mmax_a[i]=LONG_LONG_MIN;
mmin_b[i]=LONG_LONG_MAX;
mmax_b[i]=LONG_LONG_MIN;
fmmax_a[i]=LONG_LONG_MIN;
fmmin_a[i]=LONG_LONG_MAX;
}
for(int i=1;i<=n;i++) cin>>a[i];
for(int j=1;j<=m;j++) cin>>b[j];
build_a();
build_b();
while(q--){
int la,ra,lb,rb;
cin>>la>>ra>>lb>>rb;
int a_max=ask_a_max(la,ra);
int a_min=ask_a_min(la,ra);
int a_fmax=ask_a_fmax(la,ra);
int a_fmin=ask_a_fmin(la,ra);
int b_max=ask_b_max(lb,rb);
int b_min=ask_b_min(lb,rb);
int ans=LONG_LONG_MIN;
ans=max(ans,a_max*(a_max>=0 ? b_min : b_max));
ans=max(ans,a_min*(a_min>=0 ? b_min : b_max));
if(a_fmax!=LONG_LONG_MIN) ans=max(ans,a_fmax*(a_fmax>=0 ? b_min : b_max));
if(a_fmin!=LONG_LONG_MAX) ans=max(ans,a_fmin*(a_fmin>=0 ? b_min : b_max));
// cout<<a_max*(a_max>=0 ? b_min : b_max)<<" ";
// cout<<a_min*(a_min>=0 ? b_min : b_max)<<" ";
// if(a_fmax!=LONG_LONG_MIN) cout<<a_fmax*(a_fmax>=0 ? b_min : b_max)<<" ";
// if(a_fmin!=LONG_LONG_MAX) cout<<a_fmin*(a_fmin>=0 ? b_min : b_max)<<endl;
cout<<ans<<endl;
// cout<<a_max<<" "<<a_min<<" "<<a_fmax<<" "<<a_fmin<<endl;
// cout<<b_max<<" "<<b_min;
// cout<<endl;
}
return 0;
}