#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct tree{
ll mz;
ll xz;
ll mf;
ll xf;
int zo;
};
int k[100003];
int z[100003];
tree t[400005];
tree p[400005];
int d[11];
int n,m,q;
void in1(int l,int r,int b){
if(l==r){
if(k[l]>0){
t[b].mz = k[l];
t[b].xz = k[l];
}else if(k[l]==0)t[b].zo = 1;
else{
t[b].mf = k[l];
t[b].xf = k[l];
}
return ;
}
int mid = (l+r)/2;
in1(l,mid,2*b);
in1(mid+1,r,2*b+1);
t[b].mz = max(t[2*b].mz,t[2*b+1].mz);
if(t[2*b].xz==0)t[b].xz = t[2*b+1].xz;
else if(t[2*b+1].xz==0)t[b].xz = t[2*b].xz;
else t[b].xz = min(t[2*b].mz,t[2*b+1].mz);
t[b].xf = min(t[2*b].xf,t[2*b+1].xf);
if(t[2*b].mf==0)t[b].mf = t[2*b+1].mf;
else if(t[2*b+1].mf==0)t[b].mf = t[2*b].mf;
else t[b].mf = max(t[2*b].mf,t[2*b+1].mf);
t[b].zo = max(t[2*b].zo,t[2*b+1].zo);
}
void in2(int l,int r,int b){
if(l==r){
if(z[l]>0){
p[b].mz = z[l];
p[b].xz = z[l];
}else if(z[l]==0)p[b].zo = 1;
else{
p[b].mf = z[l];
p[b].xf = z[l];
}
//cout<<p[b].mz<<" "<<p[b].xz<<" "<<p[b].xf<<" "<<p[b].mf<<" "<<p[b].zo<<" ";
//cout<<l<<" "<<r<<" "<<b<<"\n";
return ;
}
int mid = (l+r)/2;
in2(l,mid,2*b);
in2(mid+1,r,2*b+1);
p[b].mz = max(p[2*b].mz,p[2*b+1].mz);
if(p[2*b].xz==0)p[b].xz = p[2*b+1].xz;
else if(p[2*b+1].xz==0)p[b].xz = p[2*b].xz;
else p[b].xz = min(p[2*b].mz,p[2*b+1].mz);
p[b].xf = min(p[2*b].xf,p[2*b+1].xf);
if(p[2*b].mf==0)p[b].mf = p[2*b+1].mf;
else if(p[2*b+1].mf==0)p[b].mf = p[2*b].mf;
else p[b].mf = max(p[2*b].mf,p[2*b+1].mf);
p[b].zo = max(p[2*b].zo,p[2*b+1].zo);
//cout<<p[b].mz<<" "<<p[b].xz<<" "<<p[b].xf<<" "<<p[b].mf<<" "<<p[b].zo<<" ";
//cout<<l<<" "<<r<<" "<<b<<"\n";
}
tree qk(int l,int r,int k,int x,int y){
int md = (l+r)/2;
if(x<=l&&y>=r) return t[k];
tree se,s1,s2;
if(x<=md) se = qk(l,md,k*2,x,y);
if(y>=md+1){
s1 = qk(md+1,r,k*2+1,x,y);
if(x<=md){
s2 = se;
se.zo = max(s2.zo,s1.zo);
se.mz = max(s2.mz,s1.mz);
se.xf = min(s2.xf,s1.xf);
if(!s2.xz) se.xz = s1.xz;
else if(!s1.xz)se.xz = s2.xz;
else se.xz = min(s1.xz,s2.xz);
if(!s2.mf) se.mf = s1.mf;
else if(!s1.mf)se.mf = s2.mf;
else se.mf = max(s1.mf,s2.mf);
}
else se = s1;
}
return se;
}
tree qc (int l,int r,int k,int x,int y){
int md = (l+r)/2;
if(x<=l&&y>=r) return p[k];
tree se,s1,s2;
if(x<=md) se = qc(l,md,k*2,x,y);
if(y>=md+1){
s1 = qc(md+1,r,k*2+1,x,y);
if(x<=md){
s2 = se;
se.zo = max(s2.zo,s1.zo);
se.mz = max(s2.mz,s1.mz);
se.xf = min(s2.xf,s1.xf);
if(!s2.xz) se.xz = s1.xz;
else if(!s1.xz)se.xz = s2.xz;
else se.xz = min(s1.xz,s2.xz);
if(!s2.mf) se.mf = s1.mf;
else if(!s1.mf)se.mf = s2.mf;
else se.mf = max(s1.mf,s2.mf);
}
else se = s1;
}
return se;
}
ll fd(tree x,tree y){ //big,small
ll ds;
if(x.mf==0&&y.mf==0) ds = x.mz*y.xz;
else if(x.mf==0&&y.xz==0) ds = x.xz*y.xf;
else if(x.xz==0&&y.xz==0) ds = x.xf*y.mf;
else if(x.xz==0&&y.mf==0) ds = x.mf*y.mz;
else if(y.mf==0) ds = x.mz*y.xz;
else if(x.mf==0) ds = x.xz*y.xf;
else if(y.xz==0) ds = x.xf*y.mf;
else if(x.xz==0) ds = x.mf*y.mz;
else ds = max(x.mf*y.mz,x.xz*y.xf);
ll e3 = 1;
if(x.zo) ds = max(e3*0,ds);
if(y.zo) ds = min(e3*0,ds);
return ds;
}
int main(){
//freopen("q.txt","r",stdin);
cin>>n>>m>>q;
for(int i=1;i<=n;i++)cin>>k[i];
for(int j=1;j<=m;j++)cin>>z[j];
in1(1,n,1);
in2(1,m,1);
for(int i=1;i<=q;i++){
ll l1,l2,r1,r2;
cin>>l1>>r1>>l2>>r2;
tree h1 = qk(1,n,1,l1,r1);
tree h2 = qc(1,m,1,l2,r2);
cout<<fd(h1,h2)<<"\n";
}
return 0;
}
用的线段树
只对四个数据点
应该是溢出问题
十分感谢!!!