Submission #857833

#TimeUsernameProblemLanguageResultExecution timeMemory
857833NeroZeinEvent Hopping (BOI22_events)C++17
100 / 100
116 ms16488 KiB
#include "bits/stdc++.h" using namespace std; #ifdef Nero #include "Deb.h" #else #define deb(...) #endif const int LOG = 18; const int N = 1e5 + 5; int l[N], r[N]; int nx[LOG][N]; template<typename T, class F = function<T(const T&, const T&)>> struct SparseTable { int n; F func; vector<vector<T>> mat; SparseTable(const vector<int>& a, F f) : func(f) { n = (int) a.size(); int max_log = 32 - __builtin_clz(n); mat.resize(max_log); mat[0] = a; for (int j = 1; j < max_log; ++j) { mat[j].resize(n - (1 << j) + 1); for (int i = 0; i <= n - (1 << j); ++i) { mat[j][i] = func(mat[j - 1][i], mat[j - 1][i + (1 << (j - 1))]); } } } T query(int from, int to) { assert(0 <= from && from <= to && to <= n - 1); int lg = 31 - __builtin_clz(to - from + 1); return func(mat[lg][from], mat[lg][to - (1 << lg) + 1]); } }; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int n, q; cin >> n >> q; for (int i = 1; i <= n; ++i) { cin >> l[i] >> r[i]; } vector<int> id(n); iota(id.begin(), id.end(), 1); sort(id.begin(), id.end(), [&](int i, int j) { return r[i] < r[j]; }); SparseTable<int> spa(id, [&](int i, int j) { return l[i] < l[j] ? i : j; }); for (int i = 1; i <= n; ++i) { int lo = 0, hi = n; while (lo < hi) { int mid = (lo + hi) / 2; if (r[id[mid]] >= l[i]) { hi = mid; } else { lo = mid + 1; } } int lo2 = -1, hi2 = n - 1; while (lo2 < hi2) { int mid = (lo2 + hi2 + 1) / 2; if (r[id[mid]] <= r[i]) { lo2 = mid; } else { hi2 = mid - 1; } } if (lo2 == -1 || lo == n) { continue; } int tnx = spa.query(lo, lo2); nx[0][i] = (tnx == i ? 0 : tnx); } for (int j = 1; j < LOG; ++j) { for (int i = 1; i <= n; ++i) { nx[j][i] = nx[j - 1][nx[j - 1][i]]; } } while (q--) { int st, en; cin >> st >> en; if (st == en) { cout << 0 << '\n'; continue; } if (r[en] >= r[st] && l[en] <= r[st]) { cout << 1 << '\n'; continue; } int ans = 0; for (int j = LOG - 1; j >= 0; --j) { if (l[nx[j][en]] > r[st]) { en = nx[j][en]; ans += 1 << j; } } if (l[en] > r[st] && nx[0][en]) { cout << ans + 2 << '\n'; } else { cout << "impossible" << '\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...