//T2
/*
3 2 2
0 1 2
3 4
1 3 1 2
2 3 2 2
*/
/*
0 0
3 4
6 8
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
int n,m;
const int N=303,M=100003;
ll f[N][20][N];
int f1[20][M],f2[20][M];
int a[M],b[M];
ll c[N][N];
void init(int k){
for(int i=1;i<=m;++i) f[k][0][i]=c[k][i];
for(int j=1;(1<<j)<=m;++j)
for(int i=1;i<=m;++i) f[k][j][i]=min(f[k][j-1][i],f[k][j-1][i+(1<<j-1)]);
}
ll query(int k,int l,int r){
int mx=log2(r-l+1);
return min(f[k][mx][l],f[k][mx][r-(1<<mx)+1]);
}
void init1(){
for(int i=1;i<=n;++i) f1[0][i]=a[i];
for(int j=1;(1<<j)<=n;++j)
for(int i=1;i<=n;++i) f1[j][i]=max(f1[j-1][i],f1[j-1][i+(1<<j-1)]);
}
void init2(){
for(int i=1;i<=n;++i) f2[0][i]=b[i];
for(int j=1;(1<<j)<=n;++j)
for(int i=1;i<=n;++i) f2[j][i]=min(f2[j-1][i],f2[j-1][i+(1<<j-1)]);
}
int query1(int l,int r){
int mx=log2(r-l+1);
return max(f1[mx][l],f1[mx][r-(1<<mx)+1]);
}
int query2(int l,int r){
int mx=log2(r-l+1);
return min(f2[mx][l],f2[mx][r-(1<<mx)+1]);
}
signed main(){
// freopen("game.in","r",stdin);
// freopen("game.out","w",stdout);
int q; cin>>n>>m>>q;
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=m;++i) scanf("%d",&b[i]);
if(n<=300 && m<=300 && q<=1010){
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j) c[i][j]=a[i]*b[j];
for(int i=1;i<=n;++i) init(i);
while(q--){
int l1,r1,l2,r2; scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
long long ans=-1e18; ans-=10;
for(int i=l1;i<=r1;++i) ans=max(ans,query(i,l2,r2));
printf("%lld\n",ans);
}
return 0;
}
// for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
// for(int i=1;i<=m;++i) scanf("%lld",&b[i]);
// for(int i=1;i<=n;++i)
// for(int j=1;j<=m;++j) c[i][j]=a[i]*b[j];
// for(int i=1;i<=n;++i) init(i);
// while(q--){
// int l1,r1,l2,r2; scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
// long long ans=-1e18-10;
// for(int i=l1;i<=r1;++i) ans=max(ans,query(i,l2,r2));
// printf("%lld\n",ans);
// }
init1(); init2();
while(q--){
int l1,l2,r1,r2; scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
if(l1==r1 && n<=1000 && m<=1000){
ll ans=1e18; ans+=10;
for(int i=l2;i<=r2;++i) ans=min((ll)a[l1]*b[i],ans);
printf("%lld\n",ans);
continue;
}
if(l2==r2 && n<=1000 && m<=1000){
ll ans=-1e18; ans-=10;
for(int i=l1;i<=r1;++i) ans=max((ll)a[i]*b[l2],ans);
printf("%lld\n",ans);
continue;
}
ll ans=query1(l1,r1)*query2(l2,r2);
printf("%lld\n",ans);
}
return 0;
}
这份代码已经送我退役了,谁能看看改过的这份代码为什么0分。
写了好几个 st 表。