Submission #1194774

#TimeUsernameProblemLanguageResultExecution timeMemory
1194774biankRailway Trip 2 (JOI22_ho_t4)C++20
100 / 100
375 ms37640 KiB
#include <bits/stdc++.h>

using namespace std;

#define forn(i,n) for(int i=0;i<int(n);i++)
#define forsn(i,s,n) for(int i=int(s);i<int(n);i++)
#define dforn(i,n) for(int i=int(n)-1;i>=0;i--)
#define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--)
#define fst first
#define snd second
#define pb push_back
#define eb emplace_back
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()

typedef long long ll;
typedef vector<ll> vll;
typedef vector<int> vi;
typedef pair<int,int> ii;

const int K = 17;
const int SZ = 1 << K;
const int INF = 1e9;

int maxi[2 * SZ], mini[2 * SZ];

template<typename T>
void chmin(T &x, T v) {
    if (x > v) x = v;
}

template<typename T>
void chmax(T &x, T v) {
    if (x < v) x = v;
}

void update(int l, int r, int v) {
    for (l += SZ, r += SZ; l < r; l /= 2, r /= 2) {
        if (l & 1) {
            chmax(maxi[l], v);
            chmin(mini[l], v);
            l++;
        }
        if (r & 1) {
            --r;
            chmax(maxi[r], v);
            chmin(mini[r], v);
        }
    }
} 

int queryMax(int i) {
    int res = maxi[i += SZ];
    while (i /= 2) chmax(res, maxi[i]);
    return res;
}

int queryMin(int i) {
    int res = mini[i += SZ];
    while (i /= 2) chmin(res, mini[i]);
    return res;
}

int stMin[K][2 * SZ], stMax[K][2 * SZ];

int askMin(int k, int l, int r) {
    int res = INF;
    for (l += SZ, r += SZ; l < r; l /= 2, r /= 2) {
        if (l & 1) chmin(res, stMin[k][l++]);
        if (r & 1) chmin(res, stMin[k][--r]);
    }
    return res;
}

int askMax(int k, int l, int r) {
    int res = -INF;
    for (l += SZ, r += SZ; l < r; l /= 2, r /= 2) {
        if (l & 1) chmax(res, stMax[k][l++]);
        if (r & 1) chmax(res, stMax[k][--r]);
    }
    return res;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int n;
    {
        int m, k;
        cin >> n >> k >> m;
        forn(i, 2 * SZ) mini[i] = INF, maxi[i] = -INF;
        forn(i, n) update(i, i + 1, i);
        forn(i, m) {
            int a, b;
            cin >> a >> b;
            --a, --b;
            if (a < b) {
                update(a, min(a + k, b), b);
            } else {
                update(max(a - k + 1, b + 1), a + 1, b);
            }
        }
    }
    
    forn(k, K) forn(i, 2 * SZ) stMin[k][i] = INF, stMax[k][i] = -INF;
    forn(i, n) stMin[0][i + SZ] = queryMin(i), stMax[0][i + SZ] = queryMax(i);
    forn(k, K) {
        dforsn(i, 1, SZ) {
            stMin[k][i] = min(stMin[k][2 * i], stMin[k][2 * i + 1]);
            stMax[k][i] = max(stMax[k][2 * i], stMax[k][2 * i + 1]);
        }
        if (k < K - 1) forn(i, n) {
            int l = stMin[k][i + SZ], r = stMax[k][i + SZ];
            stMin[k + 1][i + SZ] = askMin(k, l, r + 1);
            stMax[k + 1][i + SZ] = askMax(k, l, r + 1);
        }
    }
    
    int q;
    cin >> q;
    forn(_, q) {
        int s, t;
        cin >> s >> t;
        --s, --t;
        int l = s, r = s;
        int dist = 1;
        dforn(k, K) {
            int nextL = askMin(k, l, r + 1);
            int nextR = askMax(k, l, r + 1);
            if (nextL > t || nextR < t) {
                l = nextL, r = nextR;
                dist += 1 << k;
            }
        }
        int nextL = askMin(0, l, r + 1);
        int nextR = askMax(0, l, r + 1);
        l = nextL, r = nextR;
        if (l <= t && t <= r) cout << dist << '\n';
        else cout << "-1\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...