两件事。
第一是这道题民间数据好歹还对了几个,官方数据直接挂完了。求调。
const int MAXN=1e6+5,MAXLG=35,INF=LLONG_MAX;
int n,m,q,a[MAXN],b[MAXN],lg[MAXN];
int APosMax[MAXN][MAXLG],APosMin[MAXN][MAXLG];
//Pos: >=0; Neg: <0
int ANegMax[MAXN][MAXLG],ANegMin[MAXN][MAXLG];
int BMax[MAXN][MAXLG],BMin[MAXN][MAXLG];
inline int APMax(int l,int r){
int s=lg[r-l+1]-1,p=r-(1<<s)+1;
return max(APosMax[l][s],APosMax[p][s]);
}
inline int APMin(int l,int r){
int s=lg[r-l+1]-1,p=r-(1<<s)+1;
return min(APosMin[l][s],APosMin[p][s]);
}
inline int ANMax(int l,int r){
int s=lg[r-l+1]-1,p=r-(1<<s)+1;
return max(ANegMax[l][s],ANegMax[p][s]);
}
inline int ANMin(int l,int r){
int s=lg[r-l+1]-1,p=r-(1<<s)+1;
return min(ANegMin[l][s],ANegMin[p][s]);
}
inline int BMMax(int l,int r){
int s=lg[r-l+1]-1,p=r-(1<<s)+1;
return max(BMax[l][s],BMax[p][s]);
}
inline int BMMin(int l,int r){
int s=lg[r-l+1]-1,p=r-(1<<s)+1;
return min(BMin[l][s],BMin[p][s]);
}
inline void solve(int l1,int r1,int l2,int r2){
int aposmax=APMax(l1,r1),aposmin=APMin(l1,r1);
int anegmax=ANMax(l1,r1),anegmin=ANMin(l1,r1);
int bmax=BMMax(l2,r2),bmin=BMMin(l2,r2);
// write(aposmax),putchar(' '),write(aposmin),puts("");
// write(anegmax),putchar(' '),write(anegmin),puts("");
// write(bmax),putchar(' '),write(bmin),puts("");
int ans=-INF;
if(aposmax==-INF||aposmin==INF){
//non pos
ans=bmax*anegmax;
}
else if(anegmax==-INF||aposmax==INF){
//non neg
ans=bmin*aposmin;
}
else{
if(bmax>=0&&bmin<0) ans=max(anegmax*bmax,aposmin*bmin);
else if(bmax>=0&&bmin>=0) ans=aposmax*bmin;
else{
//bmax<0&&bmin<0
ans=anegmin*bmax;
}
}
write(ans),puts("");
}
signed main()
{
n=read(),m=read(),q=read();
for(int i=1;i<=n;i++) a[i]=read();
for(int i=1;i<=m;i++) b[i]=read();
for(int i=1;i<=MAXN-5;i++) lg[i]=lg[i-1]+(1<<lg[i-1]==i);
for(int i=1;i<=n;i++){
APosMax[i][0]=(a[i]>=0)?a[i]:-INF;
APosMin[i][0]=(a[i]>=0)?a[i]:INF;
ANegMax[i][0]=(a[i]<0)?a[i]:-INF;
ANegMin[i][0]=(a[i]<0)?a[i]:INF;
}
for(int i=1;i<=m;i++){
BMax[i][0]=b[i],BMin[i][0]=b[i];
}
for(int j=1;j<=lg[n]+3;j++){
for(int i=1;i+(1<<j)-1<=n;i++){
int p=i+(1<<(j-1));
APosMax[i][j]=max(APosMax[i][j-1],APosMax[p][j-1]);
APosMin[i][j]=min(APosMin[i][j-1],APosMin[p][j-1]);
ANegMax[i][j]=max(ANegMax[i][j-1],ANegMax[p][j-1]);
ANegMin[i][j]=min(ANegMin[i][j-1],ANegMin[p][j-1]);
}
}
for(int j=1;j<=lg[m]+3;j++){
for(int i=1;i+(1<<j)-1<=m;i++){
int p=i+(1<<(j-1));
BMax[i][j]=max(BMax[i][j-1],BMax[p][j-1]);
BMin[i][j]=min(BMin[i][j-1],BMin[p][j-1]);
}
}
for(int i=1;i<=q;i++){
int x=read(),y=read(),z=read(),w=read();
solve(x,y,z,w);
}
}
另外一件事是捞贴。