제출 #708201

#제출 시각아이디문제언어결과실행 시간메모리
708201alvingogoTwo Antennas (JOI19_antennas)C++14
100 / 100
502 ms71004 KiB
#include <bits/stdc++.h> #pragma GCC optimize("Ofast") #define AquA cin.tie(0);ios_base::sync_with_stdio(0); #define fs first #define sc second #define p_q priority_queue #define int long long using namespace std; const int inf=3e10; struct ST{ struct no{ int mx=-inf,mn=inf,tx=-inf,tn=inf; int ans=-1; int tz=0; }; vector<no> st; void init(int x){ st.resize(4*x); } void upd(int v,int x){ st[v].tn=min(st[v].tn,x); st[v].tx=max(st[v].tx,x); st[v].tz=1; st[v].ans=max(st[v].ans,max(st[v].mx-x,x-st[v].mn)); } void pudo(int v){ if(!st[v].tz){ return; } upd(2*v+1,st[v].tx); upd(2*v+1,st[v].tn); upd(2*v+2,st[v].tx); upd(2*v+2,st[v].tn); st[v].tn=inf; st[v].tx=-inf; st[v].tz=0; } void pull(int v){ st[v].ans=max(st[2*v+1].ans,st[2*v+2].ans); st[v].mx=max(st[2*v+1].mx,st[2*v+2].mx); st[v].mn=min(st[2*v+1].mn,st[2*v+2].mn); } void update(int v,int L,int R,int l,int r,int x){ if(L==l && r==R){ upd(v,x); return; } pudo(v); int m=(L+R)/2; if(r<=m){ update(2*v+1,L,m,l,r,x); } else if(l>m){ update(2*v+2,m+1,R,l,r,x); } else{ update(2*v+1,L,m,l,m,x); update(2*v+2,m+1,R,m+1,r,x); } pull(v); } void update2(int v,int L,int R,int p,int a){ if(L==R){ if(a<0){ st[v].mx=-inf; st[v].mn=inf; } else{ st[v].mx=a; st[v].mn=a; } return; } pudo(v); int m=(L+R)/2; if(p<=m){ update2(2*v+1,L,m,p,a); } else{ update2(2*v+2,m+1,R,p,a); } pull(v); } int query(int v,int L,int R,int l,int r){ if(L==l && r==R){ return st[v].ans; } int m=(L+R)/2; pudo(v); if(r<=m){ return query(2*v+1,L,m,l,r); } else if(l>m){ return query(2*v+2,m+1,R,l,r); } else{ return max(query(2*v+1,L,m,l,m),query(2*v+2,m+1,R,m+1,r)); } } }st; struct qu{ int l,r; int id; }; signed main(){ AquA; int n; cin >> n; vector<int> h(n),a(n),b(n); for(int i=0;i<n;i++){ cin >> h[i] >> a[i] >> b[i]; } int q; cin >> q; vector<qu> vq(q); for(int i=0;i<q;i++){ cin >> vq[i].l >> vq[i].r; vq[i].l--; vq[i].r--; vq[i].id=i; } vector<vector<int> > act(n),ina(n); sort(vq.begin(),vq.end(),[&](qu a,qu b){return a.r<b.r;}); vector<int> ans(q); int z=0; st.init(n); for(int i=0;i<n;i++){ for(auto x:act[i]){ st.update2(0,0,n-1,x,h[x]); } if(i-a[i]>=0){ st.update(0,0,n-1,max(0ll,i-b[i]),i-a[i],h[i]); } while(z<q && vq[z].r==i){ ans[vq[z].id]=st.query(0,0,n-1,vq[z].l,i); z++; } if(i+a[i]<n){ act[i+a[i]].push_back(i); } if(i+b[i]<n){ ina[i+b[i]].push_back(i); } for(auto x:ina[i]){ st.update2(0,0,n-1,x,-1); } } for(int i=0;i<q;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...