제출 #1268901

#제출 시각아이디문제언어결과실행 시간메모리
1268901noyancanturkTwo Antennas (JOI19_antennas)C++20
100 / 100
353 ms43916 KiB
#include<bits/stdc++.h>
using namespace std;

#define pb push_back

const int lim=2e5+100;

int n,q;

int h[lim],a[lim],b[lim];
int l[lim],r[lim];
int ans[lim];
vector<int>v[lim];

vector<int>come[lim],go[lim];

struct{
  int tree[4*lim],mini[4*lim],maxi[4*lim],minl[4*lim],maxl[4*lim];
  void init(){
    for(int i=0;i<4*n;i++){
      tree[i]=-1;
      mini[i]=minl[i]=INT_MAX;
      maxi[i]=maxl[i]=INT_MIN;
    }
  }
  void push(int node,int l,int r){
    if((mini[node]^INT_MAX)&&(minl[node]^INT_MAX)){
      tree[node]=max({tree[node],maxl[node]-mini[node],maxi[node]-minl[node]});
    }
    if(minl[node]^INT_MAX){
      if(l^r){
        int child=node<<1;
        minl[child]=min(minl[child],minl[node]);
        minl[child|1]=min(minl[child|1],minl[node]);
        maxl[child]=max(maxl[child],maxl[node]);
        maxl[child|1]=max(maxl[child|1],maxl[node]);
      }
      minl[node]=INT_MAX;
      maxl[node]=INT_MIN;
    }
  }
  int P;
  void update(int l,int r,int node){
    push(node,l,r);
    if(l==r){
      mini[node]^=INT_MAX^h[l];
      maxi[node]^=INT_MIN^h[l];
      return;
    }
    int mid=l+r>>1,child=node<<1;
    if(P<=mid)update(l,mid,child),push(child|1,mid+1,r);
    else push(child,l,mid),update(mid+1,r,child|1);
    mini[node]=min(mini[child],mini[child|1]);
    maxi[node]=max(maxi[child],maxi[child|1]);
  }
  void update(int p){
    P=p;
    update(0,n-1,1);
  }
  void insert(int l,int r,int node){
    if(P+a[P]<=l&&r<=P+b[P]){
      minl[node]=min(minl[node],h[P]);
      maxl[node]=max(maxl[node],h[P]);
      push(node,l,r);
      return;
    }
    push(node,l,r);
    if(r<P+a[P]||P+b[P]<l)return;
    int mid=l+r>>1,child=node<<1;
    insert(l,mid,child),insert(mid+1,r,child|1);
    tree[node]=max(tree[child],tree[child|1]);
  }
  void insert(int p){
    P=p;
    insert(0,n-1,1);
  }
  int ANS;
  void query(int l,int r,int node){
    if(P<l)return;
    push(node,l,r);
    if(r<=P){
      // cerr<<"took "<<node<<' '<<l<<' '<<r<<' '<<tree[node]<<'\n';
      ANS=max(ANS,tree[node]);
      return;
    }
    int mid=l+r>>1,child=node<<1;
    query(l,mid,child),query(mid+1,r,child|1);
  }
  int query(int p){
    P=p,ANS=-1;
    query(0,n-1,1);
    return ANS;
  }
}st;

int main(){
  ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
  cin>>n;
  for(int i=0;i<n;i++){
    cin>>h[i]>>a[i]>>b[i];
  }
  cin>>q;
  for(int i=0;i<q;i++){
    cin>>l[i]>>r[i];
    l[i]--,r[i]--;
    v[l[i]].pb(i);
  }
  for(int i=0;i<n;i++){
    if(0<=i-a[i]){
      come[i-a[i]].pb(i);
      go[max(0,i-b[i])].pb(i);
    }
  }
  st.init();
  for(int i=n-1;0<=i;i--){
    // cerr<<"at "<<i<<'\n';
    for(int j:come[i]){
      st.update(j);
    }
    if(i+a[i]<n){
      st.insert(i);
    }
    for(int j:v[i]){
      // cerr<<"ask "<<j<<' '<<l[j]<<' '<<r[j]<<'\n';
      ans[j]=st.query(r[j]);
    }
    for(int j:go[i]){
      st.update(j);
    }
    // cerr<<'\n';
  }
  for(int i=0;i<q;i++){
    cout<<ans[i]<<'\n';
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...