Submission #1355528

#TimeUsernameProblemLanguageResultExecution timeMemory
1355528animal_migrationTwo Antennas (JOI19_antennas)C++17
0 / 100
943 ms67980 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define pb push_back
#define eb emplace_back
#define pf printf
#define rep(x,y,z) for (int x=y;x<z;x++)
const int inf=1e17+7;
const int mn=2e5+7;

int min(int a, int b){ return (a<b?a:b); }
int max(int a, int b){ return (a>b?a:b); }

struct T{ //a - b, range set max, point insert/remove
  #define lc (i*2+1)
  #define rc (i*2+2)
  #define m ((l+r)/2)
  int f[mn*4], fm[mn*4], s[mn*4], sm[mn*4], ma[mn*4], t[mn*4], tv[mn*4];
  void pu(int i){
    f[i]=inf, fm[i]=inf, s[i]=inf, sm[i]=inf;
    ma[i]=max(ma[lc],ma[rc]);
    vector<pii> vv={{f[lc],fm[lc]},{f[rc],fm[rc]},{s[lc],sm[lc]},{s[rc],sm[rc]}};
    for (auto [t,v]:vv){
      if (t<f[i]){
        s[i]=f[i]; sm[i]=fm[i];
        f[i]=t; fm[i]=v;
      }else if (t==f[i]){
        fm[i]=min(v,fm[i]);
      }else if (t<s[i]){
        s[i]=t; sm[i]=v;
      }else if (t==s[i]){
        sm[i]=min(v,sm[i]);
      }
    }
  }
  void pd(int i, int l, int r){
    if (!t[i]) return;
    int v=tv[i];
    vector<tuple<int,int,int>> vv={{lc,l,m},{rc,m+1,r}};
    for (auto [ii,ll,rr]:vv){
      if (ll==rr){
        f[ii]=max(f[ii],v); ma[ii]=f[ii]-fm[ii]; continue;
      }
      if (v<=f[ii]) continue;
      else if (v<=s[ii]){
        f[ii]=v; t[ii]=1; tv[ii]=max(tv[ii],v); ma[ii]=max(ma[ii],f[ii]-fm[ii]);
      }
    }
    t[i]=0; tv[i]=-inf;
  }
  void bld(){
    rep(i,0,mn*4) f[i]=s[i]=-inf, fm[i]=sm[i]=inf, ma[i]=-inf, t[i]=0, tv[i]=-inf;
  }
  void chm(int i, int l, int r, int ql, int qr, int v){ //rng set mx
    if (ql>qr||l>qr||r<ql) return;
    if (ql<=l&&r<=qr){
      if (l==r){
        f[i]=max(f[i],v); ma[i]=f[i]-fm[i]; return;
      }
      if (v<=f[i]) return;
      else if (v<=s[i]){
        f[i]=v; t[i]=1; tv[i]=max(tv[i],v); ma[i]=max(ma[i],f[i]-fm[i]);
        return;
      }
    }
    pd(i,l,r);
    chm(lc,l,m,ql,qr,v); chm(rc,m+1,r,ql,qr,v);
    pu(i);
  }
  void upd(int i, int l, int r, int x, int v, bool o){
    if (l==r){
      if (o){ fm[i]=inf+7; ma[i]=-inf; } //rem
      else { f[i]=-inf; fm[i]=v; ma[i]=f[i]-fm[i]; }
      return;
    }
    pd(i,l,r);
    if (x<=m) upd(lc,l,m,x,v,o);
    else upd(rc,m+1,r,x,v,o);
    pu(i);
  }
  int qry(int i, int l, int r, int ql, int qr){
    if (l>qr||r<ql) return -inf;
    if (ql<=l&&r<=qr) return ma[i];
    pd(i,l,r);
    return max(qry(lc,l,m,ql,qr),qry(rc,m+1,r,ql,qr));
  }
  #undef lc
  #undef rc
  #undef m
};

signed main(){
  cin.tie(nullptr)->ios::sync_with_stdio(0);
  int n;
  cin>>n;
  vector<vector<int>> add(n),rem(n);
  vector<int> h(n),a(n),b(n);
  vector<pii> qry(n);
  rep(i,0,n){
    int hh,aa,bb;
    cin>>hh>>aa>>bb;
    h[i]=hh; a[i]=aa; b[i]=bb;
    int l=i+a[i], r=i+b[i];
    l=max(0,l); l=min(n-1,l); r++;
    r=max(0,r); r=min(n,r);
    add[l].pb(i);
    if (r<n) rem[r].pb(i);
    // pf("rig %lld: %lld %lld\n",i,l,r);
    l=i-b[i];
    r=i-a[i];
    l=max(0,l); l=min(n,l);
    r=max(0,r); r=min(n-1,r);
    qry[i]={l,r};
    // pf("lef %lld: %lld %lld\n",i,l,r);
  }
  int q;
  cin>>q;
  vector<vector<pii>> swp(n);
  rep(i,0,q){
    int l,r; cin>>l>>r;
    l--; r--; swp[r].pb({l,i});
  }
  vector<int> ans(q,-1);
  for (int t:{1,-1}){
    // pf("%lld:\n",t);
    T tr;
    tr.bld();
    rep(r,0,n){
      for (int i:add[r]) tr.upd(0,0,n-1,i,h[i]*t,0); //pf("add: %lld %lld\n",i,h[i]*t);
      for (int i:rem[r]) tr.upd(0,0,n-1,i,h[i]*t,1); //pf("rem: %lld %lld\n",i,h[i]*t);
      tr.chm(0,0,n-1,qry[r].fi,qry[r].se,h[r]*t);
      // pf("chm: %lld %lld %lld\n",qry[r].fi,qry[r].se,h[r]*t);
      for (auto [l,i]:swp[r]){
        ans[i]=max(ans[i],tr.qry(0,0,n-1,l,r));
        // pf("qry %lld %lld: %lld -> %lld\n",l,r,tr.qry(0,0,n-1,l,r),i);
      }
    }
  }
  rep(i,0,q) pf("%lld\n",ans[i]);
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...