제출 #1165072

#제출 시각아이디문제언어결과실행 시간메모리
1165072Math4Life2020Two Antennas (JOI19_antennas)C++20
100 / 100
421 ms57072 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<ll,ll>; const ll Nm = 262144; const ll E = 18; const ll INF = 1e18; ll ans[Nm]; ll H[Nm]; ll A[Nm]; ll B[Nm]; vector<pii> qryv[Nm]; //qryv[r] -> {l,i} vector<ll> ton[Nm]; //vector of i: turn on vector<ll> toff[Nm]; //vector of i: turn off bool islz[2*Nm]; //default 0: is there a lazy tag? ll maxon[2*Nm]; //maximum on ll minon[2*Nm]; //miniumum on ll maxap[2*Nm]; //maximum applied ll minap[2*Nm]; //minimum applied ll stv[2*Nm]; //segtree value inline ll v2(ll x) { return __builtin_ctz(x); } void pdn(ll p) { if (p==0 || !islz[p]) { return; } islz[p]=0; stv[p]=max(stv[p],maxon[p]-minap[p]); stv[p]=max(stv[p],maxap[p]-minon[p]); //cout << "pdn(p="<<p<<"): stv="<<stv[p]<<"\n"; if (p<Nm) { maxap[2*p]=max(maxap[p],maxap[2*p]); maxap[2*p+1]=max(maxap[p],maxap[2*p+1]); minap[2*p]=min(minap[p],minap[2*p]); minap[2*p+1]=min(minap[p],minap[2*p+1]); maxap[p]=-INF; minap[p]=INF; islz[2*p]=1; islz[2*p+1]=1; } } void lft(ll p) { if (p==0 || islz[p] || p>=Nm) { return; } maxon[p]=max(maxon[2*p+1],maxon[2*p]); minon[p]=min(minon[2*p+1],minon[2*p]); stv[p]=max(stv[p],stv[2*p]); stv[p]=max(stv[p],stv[2*p+1]); } void pdnP(ll p) { for (ll e=E;e>=0;e--) { pdn(p>>e); } } void lftP(ll p) { for (ll e=1;e<=E;e++) { lft(p>>e); } } void gon(ll v) { ll p = v+Nm; pdnP(p); maxon[p]=H[v]; minon[p]=H[v]; maxap[p]=-INF; minap[p]=INF; lftP(p); } void goff(ll v) { ll p = v+Nm; pdnP(p); maxon[p]=-INF; minon[p]=INF; maxap[p]=-INF; minap[p]=INF; lftP(p); } void appl(ll l, ll r, ll h) { if (l>r) { return; } //cout << "applB: "<<l<<","<<r<<","<<h<<"\n"; ll vl = v2(l); ll vr = v2(r+1); if (vl<vr) { ll p = (l>>vl)+(1<<(E-vl)); pdnP(p); maxap[p]=max(maxap[p],h); minap[p]=min(minap[p],h); stv[p]=max(stv[p],maxap[p]-minon[p]); stv[p]=max(stv[p],maxon[p]-minap[p]); islz[p]=1; lftP(p); appl(l+(1<<vl),r,h); } else { ll p = (r>>vr)+(1<<(E-vr)); pdnP(p); maxap[p]=max(maxap[p],h); minap[p]=min(minap[p],h); stv[p]=max(stv[p],maxap[p]-minon[p]); stv[p]=max(stv[p],maxon[p]-minap[p]); islz[p]=1; lftP(p); appl(l,r-(1<<vr),h); } } ll qry(ll l, ll r) { if (l>r) { return -INF; } ll vl = v2(l); ll vr = v2(r+1); if (vl<vr) { ll p = (l>>vl)+(1<<(E-vl)); pdnP(p); //cout << "p="<<p<<", stv="<<stv[p]<<"\n"; return max(qry(l+(1<<vl),r),stv[p]); } else { ll p = (r>>vr)+(1<<(E-vr)); pdnP(p); //cout << "p="<<p<<", stv="<<stv[p]<<"\n"; return max(qry(l,r-(1<<vr)),stv[p]); } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); for (ll p=0;p<(2*Nm);p++) { maxon[p]=-INF; minon[p]=INF; maxap[p]=-INF; minap[p]=INF; stv[p]=-INF; } ll N; cin >> N; for (ll i=0;i<N;i++) { cin >> H[i] >> A[i] >> B[i]; if ((i+A[i])<N) { ton[i+A[i]].push_back(i); toff[min(i+B[i],N-1)].push_back(i); } } ll Q; cin >> Q; for (ll q=0;q<Q;q++) { ll l,r; cin >> l >> r; l--; r--; qryv[r].push_back({l,q}); } for (ll i=0;i<N;i++) { for (ll v: ton[i]) { //cout << "gon: "<<v<<"\n"; gon(v); //get on } if ((i-A[i])>=0) { //cout << "appl: "<<max(0LL,i-B[i])<<","<<(i-A[i])<<","<<H[i]<<"\n"; appl(max(0LL,i-B[i]),i-A[i],H[i]); } for (pii p0: qryv[i]) { //cout << "qry to "<<p0.second<<": "<<p0.first<<","<<i<<"\n";; ans[p0.second]=qry(p0.first,i); } for (ll v: toff[i]) { //cout <<"goff: "<<v<<"\n"; goff(v); } } for (ll q=0;q<Q;q++) { if (ans[q]>=0) { cout << ans[q] <<"\n"; } else { cout << "-1\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...