Submission #753791

#TimeUsernameProblemLanguageResultExecution timeMemory
753791willychanRailway Trip 2 (JOI22_ho_t4)C++14
100 / 100
272 ms33272 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; //#include<bits/extc++.h> //__gnu_pbds int n,k; vector<int> maxr; vector<int> minl; void setr(int l,int r,int v){ l+=n;r+=n; while(r>l){ if(l&1) {maxr[l] = max(maxr[l],v);l++;} if(r&1) {r--;maxr[r] = max(maxr[r],v);} l>>=1;r>>=1; } } void setl(int l,int r,int v){ l+=n;r+=n; while(r>l){ if(l&1) {minl[l] = min(minl[l],v);l++;} if(r&1) {r--;minl[r] = min(minl[r],v);} l>>=1;r>>=1; } } struct segtree{ vector<pair<int,int> > seg; void init(){ seg.resize(2*n); } pair<int,int> mix(pair<int,int> a,pair<int,int> b){ return {min(a.first,b.first),max(a.second,b.second)}; } void built(int ind){ if(2*ind+1>=2*n) return ; built(2*ind);built(2*ind+1); seg[ind] = mix(seg[2*ind],seg[2*ind+1]); } void modify(int ind,pair<int,int> v){ ind+=n; while(ind){ seg[ind] = mix(seg[ind],v); ind>>=1; } } pair<int,int> query(int l,int r){ l+=n;r+=n; pair<int,int> ans = {1e9,-1}; while(r>l){ if(l&1) ans = mix(ans,seg[l++]); if(r&1) ans = mix(ans,seg[--r]); l>>=1;r>>=1; } return ans; } }; vector<segtree> jump; int main(){ ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n>>k; int m;cin>>m; maxr.resize(2*n,0); minl.resize(2*n,0); for(int i=0;i<n;i++){ maxr[i] = -1; minl[i] = 1e9; maxr[i+n]=i; minl[i+n]=i; } jump.resize(18); for(int i=0;i<m;i++){ int a,b;cin>>a>>b; a--;b--; if(a<b){ setr(a,min(a+k,b+1),b); }else{ setl(max(a-k+1,b),a+1,b); } } for(int i=0;i<n;i++){ int g = i+n; while(g){ maxr[i+n] = max(maxr[i+n],maxr[g]); minl[i+n] = min(minl[i+n],minl[g]); g>>=1; } } jump[0].init(); for(int i=0;i<n;i++){ jump[0].seg[i+n] = {minl[i+n],maxr[i+n]}; } jump[0].built(1); for(int j=1;j<18;j++){ jump[j].init(); for(int i=0;i<n;i++){ pair<int,int> prevrange = jump[j-1].seg[i+n]; jump[j].seg[i+n] = jump[j-1].query(prevrange.first,prevrange.second+1); } jump[j].built(1); } /* for(int j=0;j<18;j++){ for(int i=0;i<n;i++){ cout<<jump[j].seg[i+n].first<<"~"<<jump[j].seg[i+n].second<<"|"; } cout<<"\n"; }*/ int q;cin>>q; while(q--){ int a,b;cin>>a>>b; a--;b--; ll ans =0; if(b>jump[17].seg[a+n].second || b<jump[17].seg[a+n].first){cout<<-1<<"\n";continue;} int l = a;int r = a; for(int p=17;p>=0;p--){ pair<int,int> range = jump[p].query(l,r+1); if(b<range.first || b>range.second){ l = range.first; r = range.second; ans+=(1<<p); } } cout<<ans+1<<"\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...