Submission #1123843

#TimeUsernameProblemLanguageResultExecution timeMemory
1123843Neco_arcRailway Trip 2 (JOI22_ho_t4)C++20
100 / 100
283 ms30268 KiB
#include <bits/stdc++.h>

#define ll long long
#define name "Railway Trip 2"
#define fi(i, a, b)  for(int i = a; i <= b; ++i)
#define fid(i, a, b) for(int i = a; i >= b; --i)
#define maxn (int) (1e5 + 7)

using namespace std;

int n, m, k;
pair<int, int> Range[maxn];

inline pair<int, int> cb(pair<int, int> x, pair<int, int> y) {
    return { min(x.first, y.first), max(x.second, y.second) };
}

struct IT {

    pair<int, int> st[2 * maxn];


    void update(int x, pair<int, int> val) {
        int id = x + n;
        st[id] = val;
        while(id != 1) {
            id >>= 1;
            st[id] = cb(st[id * 2], st[id * 2 + 1]);
        }
    }

    pair<int, int> get(int l, int r) {
        pair<int, int> ans = {n + 1, 0};
        l += n, r += n;

        while(l <= r) {
            ans = cb(ans, st[l]), ans = cb(ans, st[r]);
            l = (l + 1) >> 1, r = (r - 1) >> 1;
        }

        return ans;
    }

} St[18];

pair<int, int> dq[maxn];
void prepare() {
    int d = 1, c = 0;

    fi(i, 1, n) {
        while(d <= c && dq[c].first < Range[i].second) -- c;
        dq[++c] = {Range[i].second, i};
        while(d <= c && dq[d].second < i - k + 1) ++d;

        Range[i].second = dq[d].first;
    }

    d = 1, c = 0;
    fid(i, n, 1) {
        while(d <= c && dq[c].first > Range[i].first) --c;
        dq[++c] = {Range[i].first, i};
        while(d <= c && dq[d].second > i + k - 1) ++d;

        Range[i].first = dq[d].first;
    }


}

int query(int x, int y) {
    auto [l, r] = St[17].get(x, x);
    if(!(l <= y && y <= r)) return -1;

    int ans = 0; l = x, r = x;
    fid(i, 17, 0) {
        auto [u, v] = St[i].get(l, r);
        if(!(u <= y && y <= v)) l = u, r = v, ans += 1 << i;
    }

    return ans + 1;
}

void solve() {

    cin >> n >> k >> m;
    fi(i, 1, n) Range[i] = {i, i};

    fi(i, 1, m) {
        int x, y; cin >> x >> y;
        Range[x] = cb(Range[x], {y, y});
    }

    prepare();


    fi(i, 1, n) St[0].update(i, Range[i]);
    fi(j, 1, 17) {
        fi(i, 1, n) {
            auto [l, r] = St[j - 1].get(i, i);
            St[j].update(i, St[j - 1].get(l, r));
        }
    }

    int q; cin >> q;
    fi(i, 1, q) {
        int x, y; cin >> x >> y;
        cout << query(x, y) << '\n';
    }


}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    if(fopen(name".inp", "r")) {
        freopen(name".inp", "r", stdin);
        freopen(name".out", "w", stdout);
    }

    solve();

}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:118:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  118 |         freopen(name".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:119:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  119 |         freopen(name".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...