step1 不放弃
step2 观察数据量,如果我要存a b 两个数组,还要存二维数组c的话,1e5的点反正要TLE,只开4000 * 4000即可,再开long long
=>假设小L选了一行,小Q肯定会选这一行里最大的=>枚举c数组l1~r1行,打擂出每行l2~r2列最小值,这些最小值中的最大值即可
#include<bits/stdc++.h>
using namespace std;
long n,m,q,a[4001],b[4001];
long long c[4001][4001];/*大小约122MB,虽然后面会RE,但1~12点能拿分*/
inline void write(__int128 x){
if(x/10) write(x/10);
putchar((x%10)^48);
return ;/*快写,__int128不能用常规输入输出*/
}
int main(){
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=1;i<=n;i++){
for(int j=1;j<=m;j++){
c[i][j]=a[i]*b[j];
}
}//十分朴素
while(q--){
int l1,r1,l2,r2;
cin>>l1>>r1>>l2>>r2;
__int128 maxmin;
bool used=false;
for(int i=l1;i<=r1;i++){
__int128 minn;
bool usedt=false;
for(int j=l2;j<=r2;j++){
if(!usedt){
minn=c[i][j];
usedt=true;/*不赋初值是因为我也不知道c里面最小有多小,那么就避开初值问题*/
}
else if(c[i][j]<minn){
minn=c[i][j];
}
}
if(!used){
maxmin=minn;
used=true;
}/*同样我也不知道c里面最大多大,那就不赋初值*/
else if(minn>maxmin){
maxmin=minn;
}
}
if(maxmin==0) cout<<0;
else{
if(maxmin<0){
cout<<'-';//负数特判一下
maxmin*=-1;
}
write(maxmin);
}
cout<<endl;
}
return 0;
}
