Submission #916745

#TimeUsernameProblemLanguageResultExecution timeMemory
916745FilipLRailway Trip 2 (JOI22_ho_t4)C++17
100 / 100
350 ms42484 KiB
#include <bits/stdc++.h> using namespace std; #define rep(a, b) for (int a = 0; a < (b); a++) #define rep1(a, b) for (int a = 1; a <= (b); a++) #define all(x) (x).begin(), (x).end() #define printrange(s, e) {for (auto it = s; it < e; it++) {cout << *it << ' ';} cout << '\n';} using ll = long long; using pii = pair<int, int>; using pll = pair<ll, ll>; const int MOD = 1e9 + 7; #define LOCAL false const int MAX_LOGN = 17; const int MAX_N = 1<<MAX_LOGN; // >10^5 const int MAX_M = 2e5 + 7; int n, k, m, q; const int TREE_SIZE = MAX_N<<1; int ftree[TREE_SIZE]; int btree[TREE_SIZE]; void fpushrange(int l, int r, int val) { for (l += MAX_N, r += MAX_N+1; l<r; l>>=1, r>>=1) { if (l&1) { ftree[l] = max(ftree[l], val); l++; } if (r&1) { r--; ftree[r] = max(ftree[r], val); } } } void bpushrange(int l, int r, int val) { for (l += MAX_N, r += MAX_N+1; l<r; l>>=1, r>>=1) { if (l&1) { btree[l] = min(btree[l], val); l++; } if (r&1) { r--; btree[r] = min(btree[r], val); } } } int fgetmax(int idx) { int mx = INT_MIN; for (int v = idx+MAX_N; v >= 1; v>>=1) mx = max(mx, ftree[v]); return mx; } int bgetmin(int idx) { int mn = INT_MAX; for (int v = idx+MAX_N; v >= 1; v>>=1) mn = min(mn, btree[v]); return mn; } pii ivl[MAX_LOGN+1][TREE_SIZE]; pii* curtree; void build() { int l, r; for (int v = MAX_N-1; v >= 1; v--) { l = v*2; r = v*2+1; curtree[v].first = min(curtree[l].first, curtree[r].first); curtree[v].second = max(curtree[l].second, curtree[r].second); } } pii getrange(int l, int r) { int s = INT_MAX; int e = INT_MIN; for (l += MAX_N, r += MAX_N+1; l<r; l>>=1, r>>=1) { if (l&1) { s = min(s, curtree[l].first); e = max(e, curtree[l].second); l++; } if (r&1) { r--; s = min(s, curtree[r].first); e = max(e, curtree[r].second); } } return {s, e}; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); if (LOCAL) { ignore=freopen("io/in", "r", stdin); ignore=freopen("io/out", "w", stdout); } rep(i, TREE_SIZE) { ftree[i] = INT_MIN; btree[i] = INT_MAX; } cin >> n >> k; cin >> m; int a, b; rep(i, m) { cin >> a >> b; a--; b--; if (a < b) fpushrange(a, min(a+k-1, b-1), b); else bpushrange(max(a-k+1, b+1), a, b); } curtree = ivl[0]; rep(i, n) curtree[MAX_N+i] = {min(i, bgetmin(i)), max(i, fgetmax(i))}; build(); rep1(i, MAX_LOGN) { rep(v, MAX_N) { curtree = ivl[i-1]; auto [l, r] = ivl[i-1][MAX_N+v]; ivl[i][MAX_N+v] = getrange(l, r); } curtree = ivl[i]; build(); } cin >> q; rep(i, q) { int l, r; int ans = 0; bool can = false; cin >> a >> b; a--; b--; l = a; r = a; for (int p = MAX_LOGN; p >= 0; p--) { curtree = ivl[p]; auto [l2, r2] = getrange(l, r); if (!(l2 <= b && b <= r2)) { l = l2; r = r2; ans |= (1<<p); } else can = true; } if (can) cout << ans+1 << '\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...