对于第一个大样例(样例3)的输出,本应该输出 -511411449471155,而我却输出 8630107792702832640,不知道哪里错了。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e6+10;
const int INF=1e17;
int max(int a,int b) {return a>=b?a:b;}
int min(int a,int b) {return a<=b?a:b;}
int n;
int a[N];
struct aa{
int l,r,mx,mi,mxf,mif;
bool k;
}t1[N];
void pu1(int now)
{
t1[now].mx=max(t1[now*2].mx,t1[now*2+1].mx);
t1[now].mi=min(t1[now*2].mi,t1[now*2+1].mi);
t1[now].mxf=max(t1[now*2].mxf,t1[now*2+1].mxf);
t1[now].mif=min(t1[now*2].mif,t1[now*2+1].mif);
t1[now].k=max(t1[now*2].k,t1[now*2+1].k);
}
void bu1(int now,int l,int r)
{
t1[now].l=l,t1[now].r=r;
if(l==r)
{
t1[now].mx=t1[now].mi=a[l];
if(a[l]==0) t1[now].k=1;
if(a[l]<0) t1[now].mxf=a[l];
else t1[now].mxf=-INF;
if(a[l]>=0) t1[now].mif=a[l];
else t1[now].mif=INF;
}
else
{
int mid=l+r>>1;
bu1(now*2,l,mid),bu1(now*2+1,mid+1,r);
pu1(now);
}
}
int qumax1(int now,int l,int r)
{
if(t1[now].l>=l&&t1[now].r<=r) return t1[now].mx;
else
{
int maxx=-INF;
int mid=t1[now].l+t1[now].r>>1;
if(l<=mid) maxx=max(maxx,qumax1(now*2,l,r));
if(mid<r) maxx=max(maxx,qumax1(now*2+1,l,r));
return maxx;
}
}
int qumax1_f(int now,int l,int r)
{
if(t1[now].l>=l&&t1[now].r<=r) return t1[now].mxf;
else
{
int maxx=-INF;
int mid=t1[now].l+t1[now].r>>1;
if(l<=mid) maxx=max(maxx,qumax1_f(now*2,l,r));
if(mid<r) maxx=max(maxx,qumax1_f(now*2+1,l,r));
return maxx;
}
}
int qumin1(int now,int l,int r)
{
if(t1[now].l>=l&&t1[now].r<=r) return t1[now].mi;
else
{
int minn=INF;
int mid=t1[now].l+t1[now].r>>1;
if(l<=mid) minn=min(minn,qumin1(now*2,l,r));
if(mid<r) minn=min(minn,qumin1(now*2+1,l,r));
return minn;
}
}
int qumin1_f(int now,int l,int r)
{
if(t1[now].l>=l&&t1[now].r<=r) return t1[now].mif;
else
{
int minn=INF;
int mid=t1[now].l+t1[now].r>>1;
if(l<=mid) minn=min(minn,qumin1_f(now*2,l,r));
if(mid<r) minn=min(minn,qumin1_f(now*2+1,l,r));
return minn;
}
}
int m;
int b[N];
struct bb{
int l,r,mx,mi,mxf,mif;
bool k;
}t2[N];
void pu2(int now)
{
t2[now].mx=max(t2[now*2].mx,t2[now*2+1].mx);
t2[now].mi=min(t2[now*2].mi,t2[now*2+1].mi);
t2[now].mxf=max(t2[now*2].mxf,t2[now*2+1].mxf);
t2[now].mif=min(t2[now*2].mif,t2[now*2+1].mif);
t2[now].k=max(t2[now*2].k,t2[now*2+1].k);
}
void bu2(int now,int l,int r)
{
t2[now].l=l,t2[now].r=r;
if(l==r)
{
t2[now].mx=t2[now].mi=b[l];
if(b[l]==0) t2[now].k=1;
if(b[l]<0) t2[now].mxf=b[l];
else t2[now].mxf=-INF;
if(b[l]>=0) t2[now].mif=b[l];
else t2[now].mif=INF;
}
else
{
int mid=l+r>>1;
bu2(now*2,l,mid),bu2(now*2+1,mid+1,r);
pu2(now);
}
}
int qumax2(int now,int l,int r)
{
if(t2[now].l>=l&&t2[now].r<=r) return t2[now].mx;
else
{
int maxx=-INF;
int mid=t2[now].l+t2[now].r>>1;
if(l<=mid) maxx=max(maxx,qumax2(now*2,l,r));
if(mid<r) maxx=max(maxx,qumax2(now*2+1,l,r));
return maxx;
}
}
int qumin2(int now,int l,int r)
{
if(t2[now].l>=l&&t2[now].r<=r) return t2[now].mi;
else
{
int minn=INF;
int mid=t2[now].l+t2[now].r>>1;
if(l<=mid) minn=min(minn,qumin2(now*2,l,r));
if(mid<r) minn=min(minn,qumin2(now*2+1,l,r));
return minn;
}
}
int q;
signed main()
{
freopen("game3.in","r",stdin);
freopen("1.out","w",stdout);
cin>>n>>m>>q;
for(int i=1;i<=n;i++) cin>>a[i];
bu1(1,1,n);
for(int i=1;i<=m;i++) cin>>b[i];
bu2(1,1,m);
for(int i=1;i<=q;i++)
{
int ans1,ans2,ans3,ans4;
int l1,l2,r1,r2;cin>>l1>>r1>>l2>>r2;
int k1=qumax1(1,l1,r1);
if(k1==INF||k1==-INF) ans1=-INF;
else if(k1==0) ans1=0;
else if(k1>0) ans1=k1*qumin2(1,l2,r2);
else ans1=k1*qumax2(1,l2,r2);
int k2=qumin1(1,l1,r1);
if(k2==INF||k2==-INF) ans2=-INF;
if(k2==0) ans2=0;
else if(k2>0) ans2=k2*qumin2(1,l2,r2);
else ans2=k2*qumax2(1,l2,r2);
int k3=qumax1_f(1,l1,r1);
if(k3==INF||k3==-INF) ans3=-INF;
if(k3==0) ans3=0;
else if(k3>0) ans3=k3*qumin2(1,l2,r2);
else ans3=k3*qumax2(1,l2,r2);
int k4=qumin1_f(1,l1,r1);
if(k4==INF||k4==-INF) ans4=-INF;
if(k4==0) ans4=0;
else if(k4>0) ans4=k4*qumin2(1,l2,r2);
else ans4=k4*qumax2(1,l2,r2);
cout<<max(ans1,max(ans2,max(ans3,ans4)))<<endl;
}
}