#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<climits>
#define ll long long
using namespace std;
const ll N=1e5+5;
ll n,m,q;
ll a[N],b[N];
// ll xl,xr,yl,yr;
struct Queries
{
ll xl,xr,yl,yr;
}qu[N];
struct SegTree
{
ll l,r,maxn,minn;
}t[N<<2][3];
ll read()
{
ll x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}
void BuildTree(ll opt,ll p,ll l,ll r)
{
t[p][opt].l=l,t[p][opt].r=r;
t[p][opt].maxn=LLONG_MIN;
t[p][opt].minn=LLONG_MAX;
if(l==r)
{
t[p][opt].maxn=(opt==1)?a[l]:b[l];
t[p][opt].minn=(opt==1)?a[l]:b[l];
return ;
}
ll mid=(l+r)>>1;
BuildTree(opt,p<<1,l,mid);
BuildTree(opt,p<<1|1,mid+1,r);
t[p][opt].maxn=max(t[p<<1][opt].maxn,t[p<<1|1][opt].maxn);
t[p][opt].minn=min(t[p<<1][opt].minn,t[p<<1|1][opt].minn);
}
ll querymax(ll opt,ll p,ll l,ll r)
{
if(l<=t[p][opt].l && t[p][opt].r<=r) return t[p][opt].maxn;
ll mid=(t[p][opt].l+t[p][opt].r)>>1;
ll ans=LLONG_MIN;
if(l<=mid) ans=max(ans,querymax(opt,p<<1,l,r));
if(mid<r) ans=max(ans,querymax(opt,p<<1|1,l,r));
return ans;
}
ll querymin(ll opt,ll p,ll l,ll r)
{
if(l<=t[p][opt].l && t[p][opt].r<=r) return t[p][opt].minn;
ll mid=(t[p][opt].l+t[p][opt].r)>>1;
ll ans=LLONG_MAX;
if(l<=mid) ans=min(ans,querymin(opt,p<<1,l,r));
if(mid<r) ans=min(ans,querymin(opt,p<<1|1,l,r));
return ans;
}
void Sub1()
{
ll ans=1;
for(ll i=1;i<=q;i++)
{
ll maxx=querymax(1,1,qu[i].xl,qu[i].xr);
ll minx=querymin(2,1,qu[i].yl,qu[i].yr);
ans=maxx*minx;
printf("%lld\n",ans);
}
}
void condition_one(ll pos)
{
ll x=pos;
ll part1=a[qu[x].xl],part2;
if(part1>=0) part2=querymin(2,1,qu[x].yl,qu[x].yr);
else part2=querymax(2,1,qu[x].yl,qu[x].yr);
ll ans=part1*part2;
printf("%lld\n",ans);
}
void condition_two(ll x)
{
ll part1,part2=b[qu[x].yl];
if(part2>=0) part1=querymax(1,1,qu[x].xl,qu[x].xr);
else part1=querymin(1,1,qu[x].xl,qu[x].xr);
ll ans=part1*part2;
printf("%lld\n",ans);
}
void Sub2()
{
for(ll i=1;i<=q;i++)
{
if(qu[i].xl==qu[i].xr) condition_one(i);
else condition_two(i);
}
}
int main()
{
// freopen("game.in","r",stdin);
// freopen("game.out","w",stdout);
n=read(),m=read(),q=read();
bool sub1flag=true,sub2flag=true;
for(ll i=1;i<=n;i++) a[i]=read(),sub1flag&=(a[i]>0);
for(ll i=1;i<=m;i++) b[i]=read(),sub1flag&=(b[i]>0);
for(ll i=1;i<=q;i++)
{
qu[i].xl=read(),qu[i].xr=read();
qu[i].yl=read(),qu[i].yr=read();
if(qu[i].xl!=qu[i].xr && qu[i].yl!=qu[i].yr) sub2flag=false;
}
BuildTree(1,1,1,n);
// for(ll i=1;i<=10;i++) cout<<t[i][1].l<<" "<<t[i][1].r<<" "<<t[i][1].maxn<<" "<<t[i][1].minn<<endl;
BuildTree(2,1,1,m);
// cout<<t[1][1].r<<endl;
// ll testnum=read();
// while(testnum--)
// {
// ll o=read(),l=read(),r=read();
// if(o==1) cout<<querymax(2,1,l,r)<<endl;
// else cout<<querymin(2,1,l,r)<<endl;
// }
if(sub1flag)
{
Sub1();
return 0;
}
if(sub2flag)
{
Sub2();
return 0;
}
return 0;
}
这个代码LG测一直是65pts,但是到IOJ上就是40pts,有大佬帮忙看看是怎么回事吗?
Ps:IOJ是多WA了几个点
谢谢!