Submission #1361232

#TimeUsernameProblemLanguageResultExecution timeMemory
1361232gayRailway Trip 2 (JOI22_ho_t4)C++20
100 / 100
206 ms283344 KiB
#include <bits/stdc++.h>

using namespace std;

using ld = long double;
using ll = long long;

const int INF = 1e9, MOD = 1e9 + 7;

void solve();

signed main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
    ios::sync_with_stdio(false);
    cin.tie(0);
    int q = 1;
    while (q--) {
        solve();
    }
}


struct sparse_table1 {
    vector<vector<int>> v;
    int n;

    void build(int n_, vector<int> &b) {
        v.resize(__lg(n_) + 1, vector<int>(n_));
        n = n_;
        for (int i = 0; i < n; i++) {
            v[0][i] = b[i];
        }
        for (int j = 1; j <= __lg(n); j++) {
            for (int i = 0; i + (1 << j) <= n; i++) {
                v[j][i] = min(v[j - 1][i], v[j - 1][i + (1 << (j - 1))]);
            }
        }
    }

    int query(int l, int r) {
        int j = __lg(r - l);
        return min(v[j][l], v[j][r - (1 << j)]);
    }
};

struct sparse_table2 {
    vector<vector<int>> v;
    int n;

    void build(int n_, vector<int> &b) {
        v.resize(__lg(n_) + 1, vector<int>(n_));
        n = n_;
        for (int i = 0; i < n; i++) {
            v[0][i] = b[i];
        }
        for (int j = 1; j <= __lg(n); j++) {
            for (int i = 0; i + (1 << j) <= n; i++) {
                v[j][i] = max(v[j - 1][i], v[j - 1][i + (1 << (j - 1))]);
            }
        }
    }

    int query(int l, int r) {
        int j = __lg(r - l);
        return max(v[j][l], v[j][r - (1 << j)]);
    }
};

sparse_table2 t1;
sparse_table1 t2;

void solve() {
    int n, k; cin >> n >> k;
    vector<int> e1(n, -1), e2(n, n);
    int m; cin >> m;
    for (int i = 0; i < m; i++) {
        int a, b; cin >> a >> b;
        a--, b--;
        if (a <= b) {
            e1[a] = max(e1[a], b);
        } else {
            e2[a] = min(e2[a], b);
        }
    }
    t1.build(n, e1);
    t2.build(n, e2);

    vector<vector<int>> upl(19, vector<int>(n));
    vector<vector<int>> upr(19, vector<int>(n));
    vector<sparse_table1> s1(19);
    vector<sparse_table2> s2(19);
    for (int i = 0; i < n; i++) {
        int l = i, r = i;
        int lf = min(l, t2.query(l, min(n - 1, r + k - 1) + 1));
        int rf = max(r, t1.query(max(0, l - k + 1), r + 1));
        upl[0][i] = lf;
        upr[0][i] = rf;
    }
    s1[0].build(n, upl[0]);
    s2[0].build(n, upr[0]);
    for (int i = 1; i < 19; i++) {
        for (int v = 0; v < n; v++) {
            int l = upl[i - 1][v];
            int r = upr[i - 1][v];
            int lf = l, rf = r;
            lf = min(lf, s1[i - 1].query(l, r + 1));
            rf = max(rf, s2[i - 1].query(l, r + 1));
            upl[i][v] = lf;
            upr[i][v] = rf;
        }
        s1[i].build(n, upl[i]);
        s2[i].build(n, upr[i]);
    }

    int q; cin >> q;
    while (q--) {
        int s, t; cin >> s >> t;
        s--, t--;
        int cnt = 0, ans = INF;
        int l = s, r = s;
        for (int i = 18; i >= 0; i--) {
            int lf = l, rf = r;
            lf = min(lf, s1[i].query(l, r + 1));
            rf = max(rf, s2[i].query(l, r + 1));
            if (lf <= t && t <= rf) continue;
            l = lf, r = rf;
            cnt += (1 << i);
        }
        cnt++;
        int lf = min(l, t2.query(l, min(n - 1, r + k - 1) + 1));
        int rf = max(r, t1.query(max(0, l - k + 1), r + 1));
        if (lf <= t && t <= rf) {
            ans = cnt;
        }
        if (ans == INF) cout << -1 << '\n';
        else cout << ans << '\n';
    }
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...