Submission #1267774

#TimeUsernameProblemLanguageResultExecution timeMemory
1267774enzyRailway Trip 2 (JOI22_ho_t4)C++20
100 / 100
1337 ms55836 KiB
//#pragma GCC optimize("O3,unrool-loops") //#pragma GCC target("avx2") #include<bits/stdc++.h> using namespace std; const int maxn=1e5+1; const int inf=1e6+7; const int maxk=18; int esq[maxn][maxk], dir[maxn][maxk], aux_seg[4*maxn][maxk][2]; pair<int,int> seg[4*maxn][2]; void refresh(int id, int ini, int fim, int oq){ if(ini!=fim){ int e=2*id, d=2*id+1; if(!oq){ seg[e][oq].second=min(seg[e][oq].second,seg[id][oq].second); seg[d][oq].second=min(seg[d][oq].second,seg[id][oq].second); }else{ seg[e][oq].second=max(seg[e][oq].second,seg[id][oq].second); seg[d][oq].second=max(seg[d][oq].second,seg[id][oq].second); } } if(!oq){ seg[id][oq].first=min(seg[id][oq].first,seg[id][oq].second); seg[id][oq].second=inf; }else{ seg[id][oq].first=max(seg[id][oq].first,seg[id][oq].second); seg[id][oq].second=0; } } void build(int id, int ini, int fim){ if(ini==fim){ seg[id][0].first=seg[id][1].first=ini; seg[id][0].second=inf; return; } int mid=(ini+fim)/2, e=2*id, d=2*id+1; build(e,ini,mid); build(d,mid+1,fim); seg[id][0]=min(seg[e][0],seg[d][0]); seg[id][1]=max(seg[e][1],seg[d][1]); } void update(int id, int ini, int fim, int l, int r, int val, int oq){ refresh(id,ini,fim,oq); if(ini>r||fim<l) return; if(l<=ini&&fim<=r){ if(!oq) seg[id][oq].second=min(seg[id][oq].second,val); else seg[id][oq].second=max(seg[id][oq].second,val); refresh(id,ini,fim,oq); return; } int mid=(ini+fim)/2, e=2*id, d=2*id+1; update(e,ini,mid,l,r,val,oq); update(d,mid+1,fim,l,r,val,oq); if(!oq) seg[id][oq].first=min(seg[e][oq].first,seg[d][oq].first); else seg[id][oq].first=max(seg[e][oq].first,seg[d][oq].first); } int query(int id, int ini, int fim, int l, int r, int oq){ refresh(id,ini,fim,oq); if(ini>r||fim<l){ if(!oq) return inf; else return 0; } if(l<=ini&&fim<=r) return seg[id][oq].first; int mid=(ini+fim)/2, e=2*id, d=2*id+1; if(!oq) return min(query(e,ini,mid,l,r,oq),query(d,mid+1,fim,l,r,oq)); return max(query(e,ini,mid,l,r,oq),query(d,mid+1,fim,l,r,oq)); } void aux_build(int id, int ini, int fim, int b){ if(ini==fim){ aux_seg[id][b][0]=esq[ini][b]; aux_seg[id][b][1]=dir[ini][b]; return; } int mid=(ini+fim)/2, e=2*id, d=2*id+1; aux_build(e,ini,mid,b); aux_build(d,mid+1,fim,b); aux_seg[id][b][0]=min(aux_seg[e][b][0],aux_seg[d][b][0]); aux_seg[id][b][1]=max(aux_seg[e][b][1],aux_seg[d][b][1]); } int aux_query(int id, int ini, int fim, int l, int r, int b, int oq){ if(ini>r||fim<l){ if(!oq) return inf; else return 0; } if(l<=ini&&fim<=r) return aux_seg[id][b][oq]; int mid=(ini+fim)/2, e=2*id, d=2*id+1; if(!oq) return min(aux_query(e,ini,mid,l,r,b,oq),aux_query(d,mid+1,fim,l,r,b,oq)); return max(aux_query(e,ini,mid,l,r,b,oq),aux_query(d,mid+1,fim,l,r,b,oq)); } int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n, k, m; cin >> n >> k >> m; build(1,1,n); for(int i=1;i<=m;i++){ int a, b; cin >> a >> b; if(a<b) update(1,1,n,a,min(a+k-1,b),b,1); else{ swap(a,b); update(1,1,n,max(b-k+1,a),b,a,0); } } for(int i=1;i<=n;i++){ esq[i][0]=query(1,1,n,i,i,0); dir[i][0]=query(1,1,n,i,i,1); } aux_build(1,1,n,0); /*for(int i=1;i<=n;i++) cout << esq[i][0] << " "; cout << endl; for(int i=1;i<=n;i++) cout << dir[i][0] << " "; cout << endl; for(int i=1;i<=n;i++) cout << aux_query(1,1,n,i,i,0,0) << " "; cout << endl; for(int i=1;i<=n;i++) cout << aux_query(1,1,n,i,i,0,1) << " "; cout << endl;*/ for(int b=1;b<maxk;b++){ for(int i=1;i<=n;i++){ int l=esq[i][b-1], r=dir[i][b-1]; esq[i][b]=aux_query(1,1,n,l,r,b-1,0); dir[i][b]=aux_query(1,1,n,l,r,b-1,1); } aux_build(1,1,n,b); } int q; cin >> q; while(q--){ int s, t; cin >> s >> t; int resp=0, l=s, r=s; if(esq[s][maxk-1]>t||dir[s][maxk-1]<t) cout << -1 << endl; else{ for(int b=maxk-1;b>=0;b--){ int nl=aux_query(1,1,n,l,r,b,0), nr=aux_query(1,1,n,l,r,b,1); if(nl>t||nr<t){ l=nl; r=nr; resp+=(1<<b); } } cout << resp+1 << endl; } } }
#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...