Submission #674497

#TimeUsernameProblemLanguageResultExecution timeMemory
674497stanislavpolynEvent Hopping (BOI22_events)C++17
25 / 100
1589 ms2532 KiB
#include <bits/stdc++.h> #define fr(i, a, b) for (int i = (a); i <= (b); i++) #define rf(i, a, b) for (int i = (a); i >= (b); i--) #define fe(x, y) for (auto& x : y) #define fi first #define se second #define pb push_back #define mp make_pair #define mt make_tuple #define pw(x) (1LL << (x)) #define sz(x) (int)(x).size() #define all(x) (x).begin(), (x).end() using namespace std; mt19937_64 rng(chrono::system_clock::now().time_since_epoch().count()); #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; template <typename T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #define fbo find_by_order #define ook order_of_key template <typename T> bool umn(T& a, T b) { return a > b ? a = b, 1 : 0; } template <typename T> bool umx(T& a, T b) { return a < b ? a = b, 1 : 0; } using ll = long long; using ld = long double; using pii = pair<int, int>; using pll = pair<ll, ll>; template <typename T> using ve = vector<T>; const int N = 1e5 + 5; int n, q; ve<pii> a; int to[N]; int go[N][20]; int main() { #ifndef LOCAL // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); ios::sync_with_stdio(0); cin.tie(0); #else // freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); #endif cin >> n >> q; a.resize(n + 1); fr (i, 1, n) { cin >> a[i].fi >> a[i].se; // to[i] = i; } fr (i, 1, n) { fr (j, 1, n) { if (i == j) continue; if (a[j].se >= a[i].fi && a[j].se <= a[i].se) { if (!to[i] || a[to[i]].fi > a[j].fi) { to[i] = j; } } } } fr (i, 1, n) { go[i][0] = to[i]; } fr (p, 1, 19) { fr (i, 1, n) { go[i][p] = go[go[i][p - 1]][p - 1]; } } fr (i, 0, q - 1) { int s, e; cin >> s >> e; if (a[s].se > a[e].se) { cout << "impossible\n"; continue; } if (s == e) { cout << "0\n"; continue; } int v = e; int ans = 0; rf (p, 19, 0) { if (go[v][p] && a[go[v][p]].fi > a[s].se) { ans += pw(p); v = go[v][p]; } } if (to[v] && a[v].fi > a[s].se) { v = to[v]; ans++; } if (a[v].fi <= a[s].se) { ans++; cout << ans << "\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...