Submission #1274536

#TimeUsernameProblemLanguageResultExecution timeMemory
1274536MisterReaperRailway Trip 2 (JOI22_ho_t4)C++20
0 / 100
2096 ms15580 KiB
// 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 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...