#include<bits/stdc++.h>
using namespace std;
#define ll __int128
const ll inf=1e18+10;
ll c[16][2]={
{1,0},//0000
{1,0},//0001
{1,0},//0010
{1,0},//0011
{0,1},//0100
{3,2},//0101
{2,1},//0110
{2,1},//0111
{0,1},//1000
{1,3},//1001
{0,1},//1010
{1,3},//1011
{0,1},//1100
{3,2},//1101
{0,1},//1110
};
int n,m,q;
struct tree{
__int128 l,r,sum,mx[2],mn[2],f;
//mx[0]最大的负数 mx[1]最大的正数
//mn[0]最小的负数 mn[1]最小的正数
//f 是否有0
}p[400010][2];
void push_up(ll x,ll k){
p[x][k].mx[0]=max(p[x<<1|1][k].mx[0],p[x<<1][k].mx[0]);
p[x][k].mx[1]=max(p[x<<1|1][k].mx[1],p[x<<1][k].mx[1]);
p[x][k].mn[0]=min(p[x<<1|1][k].mn[0],p[x<<1][k].mn[0]);
p[x][k].mn[1]=min(p[x<<1|1][k].mn[1],p[x<<1][k].mn[1]),
p[x][k].f=p[x<<1|1][k].f|p[x<<1][k].f;
}
ll read(){
string a;
cin>>a;
ll k=0;
int len=a.size();
for(int i=0;i<len;i++){
k=k*10+a[i]-'0';
}
return k;
}
void build(ll x,ll l,ll r,ll k){
p[x][k].l=l;
p[x][k].r=r;
if(l==r){
p[x][k].sum=read();
cout<<"(";
if(p[x][k].sum==0){
p[x][k].f=1;
}
if(p[x][k].sum>0){
p[x][k].mx[1]=p[x][k].mn[1]=p[x][k].sum;
}
if(p[x][k].sum<0){
p[x][k].mx[0]=p[x][k].mn[0]=p[x][k].sum;
}
// cout<<x<<' '<<p[x][k].mn[0]<<' '<<p[x][k].mx[0]<<' '<<p[x][k].mn[1]<<' '<<p[x][k].mx[1]<<endl;
return;
}
ll mid=(l+r)>>1;
build(x<<1,l,mid,k);
build(x<<1|1,mid+1,r,k);
push_up(x,k);
// cout<<x<<' '<<p[x][k].mn[0]<<' '<<p[x][k].mx[0]<<' '<<p[x][k].mn[1]<<' '<<p[x][k].mx[1]<<endl;
}
ll query(ll x,ll l,ll r,ll k,ll t){
// cout<<p[x][k].l<<' '<<p[x][k].r<<endl;
if(p[x][k].r<l||p[x][k].l>r){
if(t==4){
return 0;
}else if(t<=1){
return inf;
}else{
return -inf;
}
}
// cout<<'*';
if(p[x][k].l>=l&&p[x][k].r<=r){
if(t==4){
return p[x][k].f;
}else if(t<=1){
return p[x][k].mn[t];
}else{
return p[x][k].mx[t%2];
}
}
if(t==4){
ll k=query(x<<1,l,r,k,t);
if(k){
return 1;
}
return query(x<<1|1,l,r,k,t);
}else if(t<=1){
return min(query(x<<1,l,r,k,t),query(x<<1|1,l,r,k,t));
}else{
return max(query(x<<1,l,r,k,t),query(x<<1|1,l,r,k,t));
}
}
int main(){
n=read();m=read();q=read();
for(int i=1;i<=400000;i++){
p[i][0].mx[0]=-inf;
p[i][0].mn[1]=inf;
p[i][0].mx[1]=p[i][0].mn[0]=0;
p[i][1].mx[0]=-inf;
p[i][1].mn[1]=inf;
p[i][1].mx[1]=p[i][1].mn[0]=0;
}
build(1,1,n,0);
build(1,1,m,1);
while(q--){
// cout<<"^%$&%$";
long long l1=read(),r1=read(),l2=read(),r2=read();
// cin>>l1>>r1>>l2>>r2;//
// scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
ll x[5]={0};
ll y[5]={0};
x[0]=query(1,l1,r1,0,0);
x[1]=query(1,l1,r1,0,2);
x[2]=query(1,l1,r1,0,1);
x[3]=query(1,l1,r1,0,3);
x[4]=query(1,l1,r1,0,4);
y[0]=query(1,l2,r2,1,0);
y[1]=query(1,l2,r2,1,2);
y[2]=query(1,l2,r2,1,1);
y[3]=query(1,l2,r2,1,3);
y[4]=query(1,l2,r2,1,4);
int f1=0,f2=0,f3=0,f4=0;
long long ans=0;
if(x[0]<0){
f1=1;
}
if(x[3]>0){
f2=1;
}
if(y[0]<0){
f3=1;
}
if(y[3]>0){
f4=1;
}
ll base=(f1<<3)+(f2<<2)+(f3<<1)+f4;
if(base==15){
ans=max(x[1]*y[3],x[2]*y[0]);
}else{
ans=x[c[base][0]]*y[c[base][1]];
}
if(x[4]){
ans=max(ans,0LL);
}
if(y[4]){
ans=min(ans,0LL);
}
printf("%lld\n",ans);
}
return 0;
}
rt,我在调这题时一直过不去,如果把51行的cout删掉就没法输出样例一第二行的"4",这是怎么回事?怎样改正?