// File railwaytrip.cpp created on 29.09.2025 at 21:19:43
#include <bits/stdc++.h>
using i64 = long long;
#ifdef DEBUG
#include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
#define debug(...) void(23)
#endif
template<typename T>
bool chmax(T& a, T b) {
if (a < b) {
a = b;
return true;
}
return false;
}
template<typename T>
bool chmin(T& a, T b) {
if (a > b) {
a = b;
return true;
}
return false;
}
constexpr int max_N = int(1E5) + 5;
int logs[max_N];
template<typename T, typename F>
struct SparseTable {
int n;
F fun;
std::vector<std::vector<T>> mat;
SparseTable() {}
SparseTable(std::vector<T>& x, F fun_) : n(x.size()), fun(fun_) {
int lg = logs[n] + 1;
mat.resize(lg);
mat[0].resize(n);
for (int i = 0; i < n; ++i) {
mat[0][i] = x[i];
}
for (int i = 1; i < lg; ++i) {
int m = n - (1 << i) + 1;
mat[i].resize(m);
for (int j = 0; j < m; ++j) {
mat[i][j] = fun(mat[i - 1][j], mat[i - 1][j + (1 << (i - 1))]);
}
}
}
T get(int l, int r) {
int d = r - l + 1;
int lg = logs[d];
return fun(mat[lg][l], mat[lg][r - (1 << lg) + 1]);
}
};
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
logs[0] = -1;
for (int i = 1; i < max_N; ++i) {
logs[i] = logs[i >> 1] + 1;
}
int N, K;
std::cin >> N >> K;
int M;
std::cin >> M;
std::vector<std::array<int, 2>> A(M);
for (int i = 0; i < M; ++i) {
std::cin >> A[i][0] >> A[i][1];
--A[i][0], --A[i][1];
}
const int LG = logs[N];
std::vector<int> gol(N), gor(N);
{
std::vector<std::vector<int>> mat(LG, std::vector<int>(N));
auto update = [&](int a, int b, int x) -> void {
int d = b - a + 1;
int lg = logs[d];
chmax(mat[lg][a], x);
chmax(mat[lg][b - (1 << lg) + 1], x);
};
for (int i = 0; i < M; ++i) {
int a = A[i][0], b = A[i][1];
if (a < b) {
int l = a, r = std::min(b, a + K - 1);
update(l, r, A[i][1]);
}
}
for(int l = LG - 1; l >= 1; --l) {
int m = N - (1 << l) + 1;
for (int i = 0; i < m; ++i) {
chmax(mat[l - 1][i], mat[l][i]);
chmax(mat[l - 1][i + (1 << (l - 1))], mat[l][i]);
}
}
for (int i = 0; i < N; ++i) {
gor[i] = std::max(i, mat[0][i]);
}
}
{
std::vector<std::vector<int>> mat(LG, std::vector<int>(N, N));
auto update = [&](int a, int b, int x) -> void {
int d = b - a + 1;
int lg = logs[d];
chmin(mat[lg][a], x);
chmin(mat[lg][b - (1 << lg) + 1], x);
};
for (int i = 0; i < M; ++i) {
int a = A[i][0], b = A[i][1];
if (a > b) {
int l = std::max(b, a - K + 1), r = a;
update(l, r, A[i][1]);
}
}
for(int l = LG - 1; l >= 1; --l) {
int m = N - (1 << l) + 1;
for (int i = 0; i < m; ++i) {
chmin(mat[l - 1][i], mat[l][i]);
chmin(mat[l - 1][i + (1 << (l - 1))], mat[l][i]);
}
}
for (int i = 0; i < N; ++i) {
gol[i] = std::min(i, mat[0][i]);
}
}
SparseTable str(gor, [&](auto lhs, auto rhs) {
return std::max(lhs, rhs);
});
SparseTable stl(gol, [&](auto lhs, auto rhs) {
return std::min(lhs, rhs);
});
int Q;
std::cin >> Q;
while (Q--) {
int S, T;
std::cin >> S >> T;
--S, --T;
int ans = -1;
int L = S, R = S;
for (int i = 0; ; i++) {
if (L <= T && T <= R) {
ans = i;
break;
}
int l = std::min(L, stl.get(L, R));
int r = std::max(R, str.get(L, R));
if (L == l && r == R) {
break;
}
L = l;
R = r;
}
std::cout << ans << '\n';
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |