Submission #1287363

#TimeUsernameProblemLanguageResultExecution timeMemory
1287363ac_quanTwo Antennas (JOI19_antennas)C++20
0 / 100
218 ms40020 KiB
#include <bits/stdc++.h> #define ll long long #define pb push_back #define fi first #define se second using namespace std; const int N=200000+7; struct Ev{int x; ll h; int t; Ev(int _x=0,ll _h=0,int _t=0):x(_x),h(_h),t(_t){}}; struct Qry{int l,r,id; bool operator<(const Qry& o) const{return r<o.r;}}; int n,m; vector<Ev> ev[N]; int L[N],Rr[N]; ll H[N]; Qry q[N]; vector<ll> st_mn, st_mx, lz_mn, lz_mx; vector<ll> segans; void build(int id,int l,int r){ if((int)st_mn.size()==0) return; if(l==r){ st_mn[id]= (ll)4e18; st_mx[id]= -(ll)4e18; segans[id]=-1; lz_mn[id]=(ll)4e18; lz_mx[id]=-(ll)4e18; return;} int mid=(l+r)>>1; build(id<<1,l,mid); build(id<<1|1,mid+1,r); st_mn[id]=min(st_mn[id<<1],st_mn[id<<1|1]); st_mx[id]=max(st_mx[id<<1],st_mx[id<<1|1]); segans[id]=max(segans[id<<1],segans[id<<1|1]); lz_mn[id]=(ll)4e18; lz_mx[id]=-(ll)4e18; } inline void apply_lazy_to_node(int id,int l,int r,ll v_mn,ll v_mx){ lz_mn[id]=min(lz_mn[id],v_mn); lz_mx[id]=max(lz_mx[id],v_mx); segans[id]=max(segans[id], max(lz_mx[id]-st_mn[id], st_mx[id]-lz_mn[id])); } void push(int id,int l,int r){ if(lz_mn[id]!=(ll)4e18 || lz_mx[id]!=(ll)-4e18){ int mid=(l+r)>>1; apply_lazy_to_node(id<<1,l,mid,lz_mn[id],lz_mx[id]); apply_lazy_to_node(id<<1|1,mid+1,r,lz_mn[id],lz_mx[id]); lz_mn[id]=(ll)4e18; lz_mx[id]=-(ll)4e18; } } void pull(int id){ st_mn[id]=min(st_mn[id<<1],st_mn[id<<1|1]); st_mx[id]=max(st_mx[id<<1],st_mx[id<<1|1]); segans[id]=max(segans[id<<1],segans[id<<1|1]); } void update_point(int id,int l,int r,int pos,ll val){ if(l>pos||r<pos) return; if(l==r){ if(val<0){ st_mn[id]=(ll)4e18; st_mx[id]=-(ll)4e18; } else { st_mn[id]=st_mx[id]=val; } lz_mn[id]=(ll)4e18; lz_mx[id]=-(ll)4e18; segans[id]=-1; return; } push(id,l,r); int mid=(l+r)>>1; update_point(id<<1,l,mid,pos,val); update_point(id<<1|1,mid+1,r,pos,val); pull(id); } void update_range(int id,int l,int r,int Lq,int Rq,ll val){ if(l>Rq||r<Lq) return; if(l>=Lq && r<=Rq){ apply_lazy_to_node(id,l,r,val,val); return; } push(id,l,r); int mid=(l+r)>>1; update_range(id<<1,l,mid,Lq,Rq,val); update_range(id<<1|1,mid+1,r,Lq,Rq,val); pull(id); } ll query(int id,int l,int r,int Lq,int Rq){ if(l>Rq||r<Lq) return -1; if(l>=Lq && r<=Rq) return segans[id]; push(id,l,r); int mid=(l+r)>>1; return max(query(id<<1,l,mid,Lq,Rq), query(id<<1|1,mid+1,r,Lq,Rq)); } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin>>n; for(int i=1;i<=n;i++){ cin>>H[i]>>L[i]>>Rr[i]; } for(int i=1;i<=n;i++){ int li=i+L[i]; int ri=i+Rr[i]+1; if(li<=n) ev[li].pb(Ev(i,H[i],1)); if(ri<=n) ev[ri].pb(Ev(i,H[i],-1)); } cin>>m; for(int i=1;i<=m;i++){cin>>q[i].l>>q[i].r; q[i].id=i;} sort(q+1,q+m+1); st_mn.assign(4*(n+5),(ll)4e18); st_mx.assign(4*(n+5),(ll)-4e18); lz_mn.assign(4*(n+5),(ll)4e18); lz_mx.assign(4*(n+5),(ll)-4e18); segans.assign(4*(n+5),-1); build(1,1,n); vector<ll> ans(m+2,-1); int cur=1; for(int i=1;i<=m;i++){ while(cur<=q[i].r){ for(auto &evv: ev[cur]){ if(evv.t==1) update_point(1,1,n,evv.x,evv.h); else update_point(1,1,n,evv.x,-1); } int li = cur - Rr[cur]; int ri = cur - L[cur]; if(ri>=1){ li = max(li,1); update_range(1,1,n,li,ri,H[cur]); } cur++; } ans[q[i].id]=query(1,1,n,q[i].l,q[i].r); } for(int i=1;i<=m;i++) cout<<ans[i]<<"\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...