记录编号 587107 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [CSP 2022S]策略游戏 最终得分 100
用户昵称 Gravatar宇战 是否通过 通过
代码语言 C++ 运行时间 5.241 s
提交时间 2024-03-13 20:46:34 内存使用 20.60 MiB
显示代码纯文本
#include<bits/stdc++.h>
#define int long long

using namespace std;
int n,m,s,a[400000],aa[400000],b[400000],q,la,laa;
struct nodee{
    int l,r,mx,mn;
}t[400002];//维护a的非负数最大值和最小值 
struct nodeee{
    int l,r,mx,mn;
}tt[400002];//维护a的负数最大值最小值
struct nodeeee{
    int l,r,mx,mn;
}ttt[400002];//维护b的最大值最小值 
void build(int p,int l,int r,int opt,int pos,int v){
    t[p].l=l;
    t[p].r=r;
    if(l==r){
        if(opt)t[p].mx=-1e18,t[p].mn=1e18;
        else t[p].mx=t[p].mn=v;
        return;
    }
    int mid=(l+r)/2;
    if (pos<=mid)build(p*2,l,mid,opt,pos,v);
    else build(p*2+1,mid+1,r,opt,pos,v);
    t[p].mx=max(t[p*2].mx,t[p*2+1].mx);
    t[p].mn=min(t[p*2].mn,t[p*2+1].mn);
    
}
void buildd(int p,int l,int r,int opt,int pos,int v){
    tt[p].l=l;
    tt[p].r=r;
    if(l==r){
        if(opt)tt[p].mx=-1e18,tt[p].mn=1e18;
        else tt[p].mx=tt[p].mn=v;
        return;
    }
    int mid=(l+r)/2;
    if (pos<=mid)buildd(p*2,l,mid,opt,pos,v);
    else buildd(p*2+1,mid+1,r,opt,pos,v);
    tt[p].mx=max(tt[p*2].mx,tt[p*2+1].mx);
    tt[p].mn=min(tt[p*2].mn,tt[p*2+1].mn);
    
}
void builddd(int p,int l,int r){
    ttt[p].l=l;
    ttt[p].r=r;
    if(l==r){
        ttt[p].mx=ttt[p].mn=b[l];
        return;
    }
    int mid=(l+r)/2;
    builddd(p*2,l,mid);
    builddd(p*2+1,mid+1,r);
    ttt[p].mx=max(ttt[p*2].mx,ttt[p*2+1].mx);
    ttt[p].mn=min(ttt[p*2].mn,ttt[p*2+1].mn);
    
}
int ax(int p,int l,int r){
    if(l<=t[p].l&&t[p].r<=r){
        return t[p].mx;
    }
    int mid=(t[p].l+t[p].r)/2;
    int val=-1e18;
    if(l<=mid)val=max(val,ax(p*2,l,r));
    if(r>mid)val=max(val,ax(p*2+1,l,r));
    return val;
}
int aax(int p,int l,int r){
    if(l<=tt[p].l&&tt[p].r<=r){
        return tt[p].mx;
    }
    int mid=(tt[p].l+tt[p].r)/2;
    int val=-1e18;
    if(l<=mid)val=max(val,aax(p*2,l,r));
    if(r>mid)val=max(val,aax(p*2+1,l,r));
    return val;
}
int bx(int p,int l,int r){
    if(l<=ttt[p].l&&ttt[p].r<=r){
        return ttt[p].mx;
    }
    int mid=(ttt[p].l+ttt[p].r)/2;
    int val=-1e18;
    if(l<=mid)val=max(val,bx(p*2,l,r));
    if(r>mid)val=max(val,bx(p*2+1,l,r));
    return val;
}
int an(int p,int l,int r){
    if(l<=t[p].l&&t[p].r<=r){
        return t[p].mn;
    }
    int mid=(t[p].l+t[p].r)/2;
    int val=1e18;
    if(l<=mid)val=min(val,an(p*2,l,r));
    if(r>mid)val=min(val,an(p*2+1,l,r));
    return val;
}
int aan(int p,int l,int r){
    if(l<=tt[p].l&&tt[p].r<=r){
        return tt[p].mn;
    }
    int mid=(tt[p].l+tt[p].r)/2;
    int val=1e18;
    if(l<=mid)val=min(val,aan(p*2,l,r));
    if(r>mid)val=min(val,aan(p*2+1,l,r));
    return val;
}
int bn(int p,int l,int r){
    if(l<=ttt[p].l&&ttt[p].r<=r){
        return ttt[p].mn;
    }
    int mid=(ttt[p].l+ttt[p].r)/2;
    int val=1e18;
    if(l<=mid)val=min(val,bn(p*2,l,r));
    if(r>mid)val=min(val,bn(p*2+1,l,r));
    return val;
}
signed main(){
    freopen("csp2022_game.in","r",stdin);
    freopen("csp2022_game.out","w",stdout);
      cin>>n>>m>>q;
      for(int i=1;i<=n;i++){
          int x;
          cin>>x;
          if(x>=0){
              build(1,1,n,0,i,x);
              buildd(1,1,n,1,i,x);
          }else{
              build(1,1,n,1,i,x);
              buildd(1,1,n,0,i,x);
          }
      }
      for(int i=1;i<=m;i++){
          cin>>b[i];
      }
      builddd(1,1,m);
      while(q--){
          int l1,r1,l2,r2;
          cin>>l1>>r1>>l2>>r2;
          int maxz=ax(1,l1,r1);
          int minz=an(1,l1,r1);
          int maxf=aax(1,l1,r1);
          int minf=aan(1,l1,r1);
          int maxb=bx(1,l2,r2);
          int minb=bn(1,l2,r2);
          int ans1,ans2,ans3,ans4;
          if(maxz>=0){
              ans1=maxz*minb;
          }else{
              ans1=-1e18;
          }
          if(minz<1e18){
              ans2=minz*minb;
          }else{
              ans2=-1e18;
          }
          if(maxf>-1e18){
              ans3=maxf*maxb;
          }else{
              ans3=-1e18;
          }
          if(minf<0){
              ans4=minf*maxb;
          }else{
              ans4=-1e18;
          }
          cout<<max(ans1,max(ans2,max(ans3,ans4)))<<endl;
      }
      return 0;
}