제출 #586913

#제출 시각아이디문제언어결과실행 시간메모리
586913dutinmeowRailway Trip 2 (JOI22_ho_t4)C++17
100 / 100
555 ms50504 KiB
#include <bits/stdc++.h> using namespace std; const int $L = 20; int main() { int N, K, M; cin >> N >> K >> M; array<vector<int>, $L> lb, rb; lb.fill(vector<int>(2 * N, -1)); rb.fill(vector<int>(2 * N, -1)); vector<int> A(M), B(M); for (int i = 0; i < M; i++) { cin >> A[i] >> B[i]; A[i]--, B[i]--; } multiset<int> mse; vector<vector<int>> ins(N), era(N); for (int i = 0; i < M; i++) { if (A[i] > B[i]) { ins[A[i]].push_back(B[i]); era[max(A[i] - K + 1, B[i] + 1)].push_back(B[i]); } } for (int i = N - 1; i >= 0; i--) { for (int k : ins[i]) mse.insert(k); ins[i].clear(); lb[0][i + N] = min(i, mse.empty() ? N : *mse.begin()); for (int k : era[i]) mse.erase(mse.lower_bound(k)); era[i].clear(); } assert(mse.empty()); for (int i = 0; i < M; i++) { if (A[i] < B[i]) { ins[A[i]].push_back(B[i]); era[min(A[i] + K - 1, B[i] - 1)].push_back(B[i]); } } for (int i = 0; i < N; i++) { for (int k : ins[i]) mse.insert(k); ins[i].clear(); rb[0][i + N] = max(i, mse.empty() ? 0 : *mse.rbegin()); for (int k : era[i]) mse.erase(mse.lower_bound(k)); era[i].clear(); } assert(mse.empty()); for (int b = 1; b < $L; b++) { for (int i = N - 1; i >= 1; i--) { lb[b - 1][i] = min(lb[b - 1][i * 2], lb[b - 1][i * 2 + 1]); rb[b - 1][i] = max(rb[b - 1][i * 2], rb[b - 1][i * 2 + 1]); } for (int i = 0; i < N; i++) { int l = lb[b - 1][i + N], r = rb[b - 1][i + N]; int retl = N, retr = 0; for (l += N, r += N + 1; l < r; l >>= 1, r >>= 1) { if (l & 1) { retl = min(retl, lb[b - 1][l]); retr = max(retr, rb[b - 1][l]); l++; } if (r & 1) { r--; retl = min(retl, lb[b - 1][r]); retr = max(retr, rb[b - 1][r]); } } lb[b][i + N] = retl, rb[b][i + N] = retr; } } int Q; cin >> Q; while (Q--) { int u, v; cin >> u >> v; u--, v--; int l = u, r = u; if (v < lb[$L - 1][u + N] || rb[$L - 1][u + N] < v) { cout << -1 << '\n'; } else { int ans = 0; for (int b = $L - 1; b >= 0; b--) { int retl = N, retr = 0; for (int ll = l + N, rr = r + N + 1; ll < rr; ll >>= 1, rr >>= 1) { if (ll & 1) { retl = min(retl, lb[b][ll]); retr = max(retr, rb[b][ll]); ll++; } if (rr & 1) { rr--; retl = min(retl, lb[b][rr]); retr = max(retr, rb[b][rr]); } } if (v < retl || retr < v) { l = retl, r = retr; ans |= (1 << b); } } 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...