Submission #1276514

#TimeUsernameProblemLanguageResultExecution timeMemory
1276514SofiatpcRailway Trip 2 (JOI22_ho_t4)C++20
100 / 100
1940 ms40160 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 1e5+5, B = 17; int mn[B+5][MAXN*4], mx[B+5][MAXN*4], lzmn[MAXN*4], lzmx[MAXN*4]; void build(int node, int l, int r){ lzmn[node] = MAXN; if(l == r){ mn[0][node] = l; mx[0][node] = l; return; } int mid = (l+r)/2 , e =node*2, d = node*2+1; build(e,l,mid); build(d,mid+1,r); mn[0][node] = min(mn[0][e],mn[0][d]); mx[0][node] = max(mx[0][e],mx[0][d]); } void refresh(int node, int l, int r){ mn[0][node] = min(mn[0][node],lzmn[node]); mx[0][node] = max(mx[0][node],lzmx[node]); if(l != r){ lzmn[node*2] = min(lzmn[node*2], lzmn[node]); lzmn[node*2+1] = min(lzmn[node*2+1], lzmn[node]); lzmx[node*2] = max(lzmx[node*2], lzmx[node]); lzmx[node*2+1] = max(lzmx[node*2+1], lzmx[node]); } lzmn[node] = MAXN; lzmx[node] = 0; } void update(int node, int l, int r, int i, int j, int t, int x){ refresh(node,l,r); if(j < l || r < i)return; if(i <= l && r <= j){ if(t == 0)lzmn[node] = x; else lzmx[node] = x; refresh(node,l,r); return; } int mid = (l+r)/2 , e = node*2,d = node*2+1; update(e,l,mid,i,j,t,x); update(d,mid+1,r,i,j,t,x); mx[0][node] = max(mx[0][e],mx[0][d]); mn[0][node] = min(mn[0][e],mn[0][d]); } int queryMN(int node, int l, int r, int i, int j, int k){ if(k == 0)refresh(node,l,r); if(j < l || r < i)return MAXN; if(i <= l && r <= j)return mn[k][node]; int mid = (l+r)/2, e = node*2, d = node*2+1; return min(queryMN(e,l,mid,i,j,k), queryMN(d,mid+1,r,i,j,k)); } int queryMX(int node, int l, int r, int i, int j, int k){ if(k == 0)refresh(node,l,r); if(j < l || r < i)return 0; if(i <= l && r <= j)return mx[k][node]; int mid = (l+r)/2, e = node*2, d = node*2+1; return max(queryMX(e,l,mid,i,j,k), queryMX(d,mid+1,r,i,j,k)); } void updateP(int node, int l, int r, int i, int k, int lx, int rx){ if(r < i || i < l)return; if(l == r){ mn[k][node] = lx; mx[k][node] = rx; return; } int mid = (l+r)/2, e = node*2, d = node*2+1; updateP(e,l,mid,i,k,lx,rx); updateP(d,mid+1,r,i,k,lx,rx); mx[k][node] = max(mx[k][e],mx[k][d]); mn[k][node] = min(mn[k][e], mn[k][d]); } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); 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(b > a) update(1,1,n, a, min(a+k-1,b), 1, b); else update(1,1,n, max(a-k+1,b), a, 0, b); } for(int k = 1; k <= B; k++){ for(int i = 1; i <= n; i++){ int ini = queryMN(1,1,n, i,i, k-1); int fim = queryMX(1,1,n, i,i, k-1); int l = queryMN(1,1,n, ini, fim, k-1); int r = queryMX(1,1,n, ini, fim, k-1); updateP(1,1,n, i,k, l,r); } } int q; cin>>q; while(q--){ int s,t; cin>>s>>t; int ans = 0, l = s, r = s; for(int k = B; k >= 0; k--){ int ll = queryMN(1,1,n, l, r, k); int rr = queryMX(1,1,n, l, r, k); if(t < ll || rr < t){l = ll; r = rr; ans += (1<<k);} } int ll = queryMN(1,1,n, l, r, 0); int rr = queryMX(1,1,n, l, r, 0); if(t < ll || rr < t)cout<<"-1\n"; else cout<<ans+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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...