```cpp
#include<bits/stdc++.h>
using namespace std;
long long n,m,q,a1[400001],a2[400001],a3[400001],a4[400001],b1[400001],b2[400001],b3[400001],b4[400001],a[100001],b[100001],l1,r1,l2,r2,t1,t2,op1,op2;
void build1(long long l,long long r,long long rt)
{if(l==r)
{
scanf("%lld",&a1[rt]);
a[++t1]=a1[rt];
a2[rt]=a1[rt];
if(a1[rt]>=0)
{
a3[rt]=a1[rt];
}
if(a1[rt]<0)
{
a4[rt]=a1[rt];
}
return;
}
long long mid=(l+r)/2;
build1(l,mid,rt*2);
build1(mid+1,r,rt*2+1);
a1[rt]=max(a1[rt*2],a1[rt*2+1]);
a2[rt]=min(a2[rt*2],a2[rt*2+1]);
a3[rt]=min(a3[rt*2],a3[rt*2+1]);
a4[rt]=max(a4[rt*2],a4[rt*2+1]);
}
void build2(long long l,long long r,long long rt)
{if(l==r)
{
scanf("%lld",&b1[rt]);
b[++t2]=b1[rt];
b2[rt]=b1[rt];
if(b1[rt]>=0)
{
b3[rt]=b1[rt];
}
if(b1[rt]<0)
{
b4[rt]=b1[rt];
}
return;
}
long long mid=(l+r)/2;
build2(l,mid,rt*2);
build2(mid+1,r,rt*2+1);
b1[rt]=max(b1[rt*2],b1[rt*2+1]);
b2[rt]=min(b2[rt*2],b2[rt*2+1]);
b3[rt]=min(b3[rt*2],b3[rt*2+1]);
b4[rt]=max(b4[rt*2],b4[rt*2+1]);
}
long long query1(long long l,long long r,long long ll,long long rr,long long rt)
{if(ll<=l&&rr>=r)
{
return a1[rt];
}
long long mid=(l+r)/2;
long long res=-0x3f3f3f3f3f;
if(ll<=mid)
{
res=max(res,query1(l,mid,ll,rr,rt*2));
}
if(rr>mid)
{
res=max(res,query1(mid+1,r,ll,rr,rt*2+1));
}
return res;
}
long long query2(long long l,long long r,long long ll,long long rr,long long rt)
{if(ll<=l&&rr>=r)
{
return a2[rt];
}
long long mid=(l+r)/2;
long long res=0x3f3f3f3f3f;
if(ll<=mid)
{
res=min(res,query2(l,mid,ll,rr,rt*2));
}
if(rr>mid)
{
res=min(res,query2(mid+1,r,ll,rr,rt*2+1));
}
return res;
}
long long query3(long long l,long long r,long long ll,long long rr,long long rt)
{if(ll<=l&&rr>=r)
{
return b1[rt];
}
long long mid=(l+r)/2;
long long res=-0x3f3f3f3f3f;
if(ll<=mid)
{
res=max(res,query3(l,mid,ll,rr,rt*2));
}
if(rr>mid)
{
res=max(res,query3(mid+1,r,ll,rr,rt*2+1));
}
return res;
}
long long query4(long long l,long long r,long long ll,long long rr,long long rt)
{if(ll<=l&&rr>=r)
{
return b2[rt];
}
long long mid=(l+r)/2;
long long res=0x3f3f3f3f3f;
if(ll<=mid)
{
res=min(res,query4(l,mid,ll,rr,rt*2));
}
if(rr>mid)
{
res=min(res,query4(mid+1,r,ll,rr,rt*2+1));
}
return res;
}
long long query5(long long l,long long r,long long ll,long long rr,long long rt)
{if(ll<=l&&rr>=r)
{
return a3[rt];
}
long long mid=(l+r)/2;
long long res=0x3f3f3f3f3f;
if(ll<=mid)
{
res=min(res,query5(l,mid,ll,rr,rt*2));
}
if(rr>mid)
{
res=min(res,query5(mid+1,r,ll,rr,rt*2+1));
}
return res;
}
long long query6(long long l,long long r,long long ll,long long rr,long long rt)
{if(ll<=l&&rr>=r)
{
return a4[rt];
}
long long mid=(l+r)/2;
long long res=-0x3f3f3f3f3f;
if(ll<=mid)
{
res=max(res,query6(l,mid,ll,rr,rt*2));
}
if(rr>mid)
{
res=max(res,query6(mid+1,r,ll,rr,rt*2+1));
}
return res;
}
long long query7(long long l,long long r,long long ll,long long rr,long long rt)
{if(ll<=l&&rr>=r)
{
return b3[rt];
}
long long mid=(l+r)/2;
long long res=0x3f3f3f3f3f;
if(ll<=mid)
{
res=min(res,query7(l,mid,ll,rr,rt*2));
}
if(rr>mid)
{
res=min(res,query7(mid+1,r,ll,rr,rt*2+1));
}
return res;
}
long long query8(long long l,long long r,long long ll,long long rr,long long rt)
{if(ll<=l&&rr>=r)
{
return b4[rt];
}
long long mid=(l+r)/2;
long long res=-0x3f3f3f3f3f;
if(ll<=mid)
{
res=max(res,query8(l,mid,ll,rr,rt*2));
}
if(rr>mid)
{
res=max(res,query8(mid+1,r,ll,rr,rt*2+1));
}
return res;
}
int main()
{//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
scanf("%lld%lld%lld",&n,&m,&q);
memset(a1,-0x3f3f3f3f3f,sizeof(a1));
memset(a2,0x3f3f3f3f3f,sizeof(a2));
memset(a3,0x3f3f3f3f3f,sizeof(a3));
memset(a4,-0x3f3f3f3f3f,sizeof(a4));
memset(b1,-0x3f3f3f3f3f,sizeof(b1));
memset(b2,0x3f3f3f3f3f,sizeof(b2));
memset(b3,0x3f3f3f3f3f,sizeof(b3));
memset(b4,-0x3f3f3f3f3f,sizeof(b4));
build1(1,n,1);
build2(1,m,1);
for (long long i=1; i<=q; ++i)
{
scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
op1=op2=0;
if(l2==r2)
{
if(l1==r1)
{
printf("%lld\n",a[l1]*b[l2]);
continue;
}
if(b[l2]>=0)
{
op1=1;
printf("%lld\n",b[l2]*query1(1,n,l1,r1,1));
continue;
}
else
{
op2=1;
printf("%lld\n",b[l2]*query2(1,n,l1,r1,1));
continue;
}
}
if(l1==r1)
{
if(a[l1]>=0)
{
printf("%lld\n",a[l1]*query4(1,m,l2,r2,1));
}
else
{
printf("%lld\n",a[l1]*query3(1,m,l2,r2,1));
}
continue;
}
if(query3(1,m,l2,r2,1)>=0)
{
op1=1;
}
if(query4(1,m,l2,r2,1)<0)
{
op2=1;
}
if(op1&&!op2)
{
printf("%lld\n",query1(1,n,l1,r1,1)*query4(1,m,l2,r2,1));
continue;
}
if(!op1&&op2)
{
printf("%lld\n",query2(1,n,l1,r1,1)*query3(1,m,l2,r2,1));
continue;
}
if(op1&&op2)
{
if(query1(1,n,l1,r1,1)>=0)
{
long long p=query5(1,n,l1,r1,1)*query4(1,m,l2,r2,1);
if(query2(1,n,l1,r1,1)<0)
{
long long q=query6(1,n,l1,r1,1)*query3(1,m,l2,r2,1);
if(p>=q)
{
printf("%lld\n",p);
continue;
}
if(p<q)
{
printf("%lld\n",q);
continue;
}
}
else
{
printf("%lld\n",p);
continue;
}
}
else
{
long long q=query6(1,n,l1,r1,1)*query3(1,m,l2,r2,1);
printf("%lld\n",q);
continue;
}
}
}
return 0;
}
```
by 1836796ad @ 2022-11-10 12:44:01
您这写得也太……建议整个结构体封装一下
by Fan_sheng @ 2022-11-10 13:23:19