样例#2输出:
0
2000000000000000000
6
2
2
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,qs;ll a[100005],b[100005];
int l1,r1,l2,r2;ll ans;
ll q[10];
struct tree{
int l,r;ll va[4];
//最大va 最小va 最大负 最小正
} t1[400005],t2[400005];
void buildt1(int p,int l,int r){
t1[p]={l,r};
if(l==r){
t1[p].va[0]=t1[p].va[1]=a[l];
t1[p].va[2]=(a[l]<0)?a[l]:1e18;
t1[p].va[3]=(a[l]>=0)?-1e18:a[l];
return;
}
int mid=(l+r)>>1;
buildt1(p*2,l,mid);buildt1(p*2+1,mid+1,r);
t1[p].va[0]=max(t1[p*2].va[0],t1[p*2+1].va[0]);
t1[p].va[1]=min(t1[p*2].va[1],t1[p*2+1].va[1]);
t1[p].va[3]=max(t1[p*2].va[3],t1[p*2+1].va[3]);
t1[p].va[4]=min(t1[p*2].va[4],t1[p*2+1].va[4]);
}
ll query1(int p,int l,int r,int rs){
if(t1[p].l>=l&&t1[p].r<=r) return t1[p].va[rs];
int mid=(t1[p].l+t1[p].r)/2;ll res=-1e18;
if(rs==0){
if(l<=mid) res=max(res,query1(p*2,l,r,rs));
if(r>mid) res=max(res,query1(p*2+1,l,r,rs));
}
else if(rs==1){
res=1e18;
if(l<=mid) res=min(res,query1(p*2,l,r,rs));
if(r>mid) res=min(res,query1(p*2+1,l,r,rs));
}
else if(rs==2){//最大负
ll tmp1=-1e18,tmp2=-1e18;
if(l<=mid) tmp1=query1(p*2,l,r,rs);
if(r>mid) tmp2=query1(p*2+1,l,r,rs);
if(tmp1<0) res=max(res,tmp1);
if(tmp2<0) res=max(res,tmp2);
}
else{//最小非负
res=1e18;ll tmp1=1e18,tmp2=1e18;
if(l<=mid) tmp1=query1(p*2,l,r,rs);
if(r>mid) tmp2=query1(p*2+1,l,r,rs);
if(tmp1>=0) res=min(res,tmp1);
if(tmp2>=0) res=min(res,tmp2);
}return res;
}
void buildt2(int p,int l,int r){
t2[p]={l,r};
if(l==r){t2[p].va[0]=t2[p].va[1]=b[l];return;}
int mid=(l+r)>>1;
buildt2(p*2,l,mid);buildt2(p*2+1,mid+1,r);
t2[p].va[1]=min(t2[p*2].va[1],t2[p*2+1].va[1]);
t2[p].va[0]=max(t2[p*2].va[0],t2[p*2+1].va[0]);
}
ll query2(int p,int l,int r,int rs){
if(t2[p].l>=l&&t2[p].r<=r) return t2[p].va[rs];
int mid=(t2[p].l+t2[p].r)/2;ll res=-1e18;
if(rs==0){
if(l<=mid) res=max(res,query2(p*2,l,r,rs));
if(r>mid) res=max(res,query2(p*2+1,l,r,rs));
}
else{
res=1e18;
if(l<=mid) res=min(res,query2(p*2,l,r,rs));
if(r>mid) res=min(res,query2(p*2+1,l,r,rs));
}return res;
}
#define o(s) printf(s)//
int main(){
cin>>n>>m>>qs;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=m;++i) cin>>b[i];
buildt1(1,1,n);buildt2(1,1,m);
for(int i=0;i<qs;++i){
cin>>l1>>r1>>l2>>r2;
q[1]=query1(1,l1,r1,0);q[2]=query1(1,l1,r1,1);q[3]=query1(1,l1,r1,2);
q[6]=query2(1,l2,r2,1);q[5]=query2(1,l2,r2,0);q[4]=query1(1,l1,r1,3);
if(q[3]==-1e18||q[3]==1e18) q[3]=q[4];
if(q[4]==1e18||q[4]==-1e18) q[4]=q[3];
cout<<q[1]<<' '<<q[2]<<' '<<q[3]<<' '<<q[4]<<' '<<q[5]<<' '<<q[6]<<' ';//
if(q[6]<0){
if(q[5]>=0){//对面可正可负
if(q[6]*q[3]>q[5]*q[4]) ans=q[3]*q[6],o("1 ");
else ans=q[4]*q[5],o("2 ");
}
else ans=q[2]*q[5],o("3 ");
}
else{//q[6]>=q[5]>=0
ans=q[1]*q[5],o("4 ");
}
cout<<ans<<endl;
}
return 0;
}
行尾有 // 的代码是调试用代码