考场上最后特判n<=1000直接跑暴力了
线段树都写错了为什么能A啊,洛谷和inf都是这样
#include<bits/stdc++.h>
using namespace std;
long long A[200000],B[200000];
int n,m,q;
struct node
{
int l,r;
long long mi,ma,zmi=INT_MAX,fma=INT_MIN;
} a[1000000],b[1000000];
struct m3
{
long long mi=INT_MAX,ma=INT_MIN,zmi=INT_MAX,fma=INT_MIN;
};
long long lmax(long a,long b)
{
return a>b?a:b;
}
long long lmin(long long a,long long b)
{
return a<b?a:b;
}
long long labs(long long x)
{
return x>0?x:-x;
}
void upm(m3 &a,m3 b)
{
if(a.ma<b.ma)
{
a.ma=b.ma;
}
if(a.mi>b.mi)
{
a.mi=b.mi;
}
if(a.zmi>b.zmi)
{
a.zmi=b.zmi;
}
if(a.fma<b.fma)
{
a.fma=b.fma;
}
return;
}
void pushupa(int i)
{
a[i].mi=lmin(a[i*2].mi,a[i*2+1].mi);
a[i].ma=lmax(a[i*2].ma,a[i*2+1].ma);
a[i].zmi=lmin(a[i*2].zmi,a[i*2+1].zmi);
a[i].fma=lmax(a[i*2].fma,a[i*2+1].fma);
}
void pushupb(int i)
{
b[i].mi=lmin(b[i*2].mi,b[i*2+1].mi);
b[i].ma=lmax(b[i*2].ma,b[i*2+1].ma);
b[i].zmi=lmin(b[i*2].zmi,b[i*2+1].zmi);
b[i].fma=lmax(b[i*2].fma,b[i*2+1].fma);
}
void builda(int i,int l,int r)
{
a[i].l=l;
a[i].r=r;
if(l==r)
{
a[i].mi=a[i].ma=A[l];
if(A[l]>=0)
{
a[i].zmi=A[l];
}
if(A[l]<=0)
{
a[i].fma=A[l];
}
return;
}
int mid=(l+r)/2;
builda(i*2,l,mid);
builda(i*2+1,mid+1,r);
pushupa(i);
return;
}
void buildb(int i,int l,int r)
{
b[i].l=l;
b[i].r=r;
if(l==r)
{
b[i].mi=b[i].ma=B[l];
if(B[l]>=0)
{
b[i].zmi=B[l];
}
if(B[l]<=0)
{
b[i].fma=B[l];
}
return;
}
int mid=(l+r)/2;
buildb(i*2,l,mid);
buildb(i*2+1,mid+1,r);
pushupb(i);
return;
}
m3 qa(int i,int x,int y)
{
m3 ate;
if(x==y)
{
m3 tem;
tem.mi=tem.ma=A[x];
if(A[x]>=0)
{
tem.zmi=A[x];
}
if(A[x]<=0)
{
tem.fma=A[x];
}
return tem;
}
if(x==a[i].l&&y==a[i].r)
{
m3 tem;
tem.mi=a[i].mi;
tem.ma=a[i].ma;
tem.zmi=a[i].zmi;
tem.fma=a[i].fma;
return tem;
}
if(x<=a[i*2].r)
{
ate=qa(i*2,x,min(a[i*2].r,y));
}
if(y>=a[i*2+1].l)
{
upm(ate,qa(i*2+1,max(a[i*2+1].l,x),y));
}
return ate;
}
m3 qb(int i,int x,int y)
{
m3 bte;
if(x==y)
{
m3 tem;
tem.mi=tem.ma=B[x];
if(B[x]>=0)
{
tem.zmi=B[x];
}
if(B[x]<=0)
{
tem.fma=B[x];
}
return tem;
}
if(x==b[i].l&&y==b[i].r)
{
m3 tem;
tem.mi=b[i].mi;
tem.ma=b[i].ma;
tem.zmi=b[i].zmi;
tem.fma=b[i].fma;
return tem;
}
if(x<=b[i*2].r)
{
bte=qb(i*2,x,min(b[i*2].r,y));
}
if(y>=b[i*2+1].l)
{
upm(bte,qb(i*2+1,max(b[i*2+1].l,x),y));
}
return bte;
}
int main()
{
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
scanf("%d%d%d",&n,&m,&q);
for(int i=1; i<=n; i++)
{
scanf("%lld",&A[i]);
}
for(int i=1; i<=m; i++)
{
scanf("%lld",&B[i]);
}
builda(1,1,n);
buildb(1,1,m);
int l1,l2,r1,r2;
for(int i=1; i<=q; i++)
{
m3 at,bt;
scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
if(n>1000)
{
at=qa(1,l1,r1);
bt=qb(1,l2,r2);
}
else
{
for(int i=l1; i<=r1; i++)
{
at.ma=lmax(at.ma,A[i]);
at.mi=lmin(at.mi,A[i]);
if(A[i]>=0)
{
at.zmi=min(at.zmi,A[i]);
}
if(A[i]<=0)
{
at.fma=max(at.fma,A[i]);
}
}
for(int i=l2; i<=r2; i++)
{
bt.ma=lmax(bt.ma,B[i]);
bt.mi=lmin(bt.mi,B[i]);
if(B[i]>=0)
{
bt.zmi=min(bt.zmi,B[i]);
}
if(B[i]<=0)
{
bt.fma=max(bt.fma,B[i]);
}
}
}
if(bt.ma<=0)
{
if(at.ma<=0)
{
printf("%lld\n",at.mi*bt.ma);
continue;
}
if(at.mi>=0)
{
printf("%lld\n",at.mi*bt.mi);
continue;
}
printf("%lld\n",at.mi*bt.ma);
continue;
}
if(bt.mi>=0)
{
if(at.ma<=0)
{
printf("%lld\n",at.ma*bt.ma);
continue;
}
if(at.mi>=0)
{
printf("%lld\n",at.ma*bt.mi);
continue;
}
printf("%lld\n",at.ma*bt.mi);
continue;
}
if(at.ma<=0)
{
printf("%lld\n",at.ma*bt.ma);
continue;
}
if(at.mi>=0)
{
printf("%lld\n",at.mi*bt.mi);
continue;
}
printf("%lld\n",at.zmi*bt.mi>at.fma*bt.ma?at.zmi*bt.mi:at.fma*bt.ma);
continue;
}
return 0;
}