这是我T2的代码,我检查了好像也没有越界啊
当然邀请大家帮我治眼瞎
#include<bits/stdc++.h>
#define int long long
#define printlf(x) print(x),putchar('\n')
#define printsp(x) print(x),putchar(' ')
using namespace std;
inline int read(){
int x=0;bool w=0;char c=getchar();
while(!isdigit(c)) w|=c=='-',c=getchar();
while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return w?-x:x;
}
inline void print(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) print(x/10);
putchar('0'+x%10);
}
int n,m,Q;
const int maxn=1e5+5,N=1e3+5,INF=LONG_LONG_MAX;
int a[maxn],b[maxn],c[N][N],tree[N][N*3],l1[maxn],r1[maxn],l2[maxn],r2[maxn];
#define ls(x) x<<1
#define rs(x) x<<1|1
#define push_up(x,p) tree[x][p]=min(tree[x][ls(p)],tree[x][rs(p)])
inline void Build(int x,int p,int l,int r){
if(l==r){
tree[x][p]=c[x][l];
return ;
}
int mid=l+r>>1;
Build(x,ls(p),l,mid);
Build(x,rs(p),mid+1,r);
push_up(x,p);
}
inline void Pre(){
for(register int i=1;i<=n;++i){
for(register int j=1;j<=m;++j)
c[i][j]=a[i]*b[j];
}
// for(register int i=1;i<=n;++i){
// for(register int j=1;j<=m;++j)
// cout<<c[i][j]<<' ';cout<<" carray\n";
// }
for(register int i=1;i<=n;++i)
Build(i,1,1,m);
}
inline int get_min(int x,int p,int l,int r,int pl,int pr){
if(l>=pl && r<=pr) return tree[x][p];
int mid=l+r>>1,res=INF;
if(pl<=mid) res=min(res,get_min(x,ls(p),l,mid,pl,pr));
if(pr>mid) res=min(res,get_min(x,rs(p),mid+1,r,pl,pr));
return res;
}
inline int Solve(int x){
int ans=-INF;
for(register int i=l1[x];i<=r1[x];++i){
ans=max(ans,get_min(i,1,1,m,l2[x],r2[x]));
}
return ans;
}
inline bool check1(){
for(register int i=1;i<=n;++i)
if(a[i]<=0) return 0;
for(register int i=1;i<=m;++i)
if(b[i]<=0) return 0;
return 1;
}
inline bool check2(){
for(register int i=1;i<=Q;++i){
if(l1[i]!=r1[i] && l2[i]!=r2[i]) return 0;
}
return 1;
}
namespace Subzheng{
int Max[maxn*3],Min[maxn*3];
#define ls(x) x<<1
#define rs(x) x<<1|1
inline void push_up1(int p){
Max[p]=max(Max[ls(p)],Max[rs(p)]);
}
inline void push_up2(int p){
Min[p]=min(Min[ls(p)],Min[rs(p)]);
}
inline void Build1(int p,int l,int r){
if(l==r){
Max[p]=a[l];
return ;
}
int mid=l+r>>1;
Build1(ls(p),l,mid);
Build1(rs(p),mid+1,r);
push_up1(p);
}
inline void Build2(int p,int l,int r){
if(l==r){
Min[p]=b[l];
return ;
}
int mid=l+r>>1;
Build2(ls(p),l,mid);
Build2(rs(p),mid+1,r);
push_up2(p);
}
inline int get_max1(int p,int l,int r,int pl,int pr){
if(l>=pl && r<=pr) return Max[p];
int mid=l+r>>1,res=-INF;
if(pl<=mid) res=max(res,get_max1(ls(p),l,mid,pl,pr));
if(pr>mid) res=max(res,get_max1(rs(p),mid+1,r,pl,pr));
return res;
}
inline int get_min2(int p,int l,int r,int pl,int pr){
if(l>=pl && r<=pr) return Min[p];
int mid=l+r>>1,res=INF;
if(pl<=mid) res=min(res,get_min2(ls(p),l,mid,pl,pr));
if(pr>mid) res=min(res,get_min2(rs(p),mid+1,r,pl,pr));
return res;
}
inline int solve(int x){
int res1=get_max1(1,1,n,l1[x],r1[x]);
int res2=get_min2(1,1,m,l2[x],r2[x]);
return res1*res2;
}
inline void Main(){
// cout<<"in Main\n";
Build1(1,1,n);
Build2(1,1,m);
for(register int i=1;i<=Q;++i){
printlf(solve(i));
}
exit(0);
}
}
namespace Subsame{
int Max1[maxn*3],Min1[maxn*3],Min2[maxn*3],Max2[maxn*3];
#define ls(x) x<<1
#define rs(x) x<<1|1
inline void push_up1(int p){
Min1[p]=min(Min1[ls(p)],Min1[rs(p)]);
Max1[p]=max(Max1[ls(p)],Max1[rs(p)]);
}
inline void push_up2(int p){
Min2[p]=min(Min2[ls(p)],Min2[rs(p)]);
Max2[p]=max(Max2[ls(p)],Max2[rs(p)]);
}
inline void Build1(int p,int l,int r){
if(l==r){
Max1[p]=a[l];
Min1[p]=a[l];
return ;
}
int mid=l+r>>1;
Build1(ls(p),l,mid);
Build1(rs(p),mid+1,r);
push_up1(p);
}
inline void Build2(int p,int l,int r){
if(l==r){
Min2[p]=b[l];
Max2[p]=b[l];
return ;
}
int mid=l+r>>1;
Build2(ls(p),l,mid);
Build2(rs(p),mid+1,r);
push_up2(p);
}
inline int get_max1(int p,int l,int r,int pl,int pr){
if(l>=pl && r<=pr) return Max1[p];
int mid=l+r>>1,res=-INF;
if(pl<=mid) res=max(res,get_max1(ls(p),l,mid,pl,pr));
if(pr>mid) res=max(res,get_max1(rs(p),mid+1,r,pl,pr));
return res;
}
inline int get_min1(int p,int l,int r,int pl,int pr){
if(l>=pl && r<=pr) return Min1[p];
int mid=l+r>>1,res=INF;
if(pl<=mid) res=min(res,get_min1(ls(p),l,mid,pl,pr));
if(pr>mid) res=min(res,get_min1(rs(p),mid+1,r,pl,pr));
return res;
}
inline int get_min2(int p,int l,int r,int pl,int pr){
if(l>=pl && r<=pr) return Min2[p];
int mid=l+r>>1,res=INF;
if(pl<=mid) res=min(res,get_min2(ls(p),l,mid,pl,pr));
if(pr>mid) res=min(res,get_min2(rs(p),mid+1,r,pl,pr));
return res;
}
inline int get_max2(int p,int l,int r,int pl,int pr){
if(l>=pl && r<=pr) return Max2[p];
int mid=l+r>>1,res=-INF;
if(pl<=mid) res=max(res,get_max2(ls(p),l,mid,pl,pr));
if(pr>mid) res=max(res,get_max2(rs(p),mid+1,r,pl,pr));
return res;
}
inline int solve(int x){
if(l1[x]==r1[x]){
if(a[l1[x]]>0) return get_min2(1,1,m,l2[x],r2[x])*a[l1[x]];
else return get_max2(1,1,m,l2[x],r2[x])*a[l1[x]];
}
if(l2[x]==r2[x]){
if(b[l2[x]]>0) return get_max1(1,1,n,l1[x],r1[x])*b[l2[x]];
else return get_min1(1,1,n,l1[x],r1[x])*b[l2[x]];
}
}
inline void Main(){
// cout<<"in Main\n";
Build1(1,1,n);
Build2(1,1,m);
for(register int i=1;i<=Q;++i){
printlf(solve(i));
}
exit(0);
}
}
signed main(){
// freopen("game.in","r",stdin);
// freopen("game.out","w",stdout);
n=read(),m=read(),Q=read();
for(register int i=1;i<=n;++i) a[i]=read();
for(register int i=1;i<=m;++i) b[i]=read();
// cout<<" ininin\n";
for(register int i=1;i<=Q;++i) l1[i]=read(),r1[i]=read(),l2[i]=read(),r2[i]=read();
// cout<<" read over\n";
if(check1()) Subzheng::Main();
if(check2()) Subsame::Main();
Pre();
for(register int i=1;i<=Q;++i){
printlf(Solve(i));
}
return 0;
}