Submission #672068

#TimeUsernameProblemLanguageResultExecution timeMemory
672068LittleCubeEvent Hopping (BOI22_events)C++14
100 / 100
202 ms21096 KiB
#include <bits/stdc++.h> #define ll long long #define pii pair<int, int> #define pll pair<ll, ll> #define F first #define S second using namespace std; const int P = 17; int N; struct sparse { int table[P][100005]; void build(int arr[]) { for(int i = 1; i <= N; i++) table[0][i] = arr[i]; for(int p = 0; p + 1 < P; p++) for(int i = 1; i <= N - (1 << p); i++) table[p + 1][i] = min(table[p][i], table[p][i + (1 << p)]); } int query(int l, int r) { int p = __lg(r - l + 1); return min(table[p][l], table[p][r - (1 << p) + 1]); } }st; int Q, rk[100005], order[100005], table[20][100005], last[100005], ans[100005], start[100005]; pii p[100005], range[100005]; signed main() { ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin >> N >> Q; for(int i = 1; i <= N; i++) cin >> p[i].F >> p[i].S; for(int i = 1; i <= N; i++) rk[i] = i; sort(rk + 1, rk + 1 + N, [&](int i, int j){return p[i].S < p[j].S;}); for(int i = 1; i <= N; i++) order[rk[i]] = i; sort(p + 1, p + 1 + N, [&](pii i, pii j){return i.S < j.S; }); for(int i = 1; i <= N; i++) table[0][i] = lower_bound(p + 1, p + 1 + N, pii(0, p[i].F), [](pii i, pii j){return i.S < j.S; }) - p; for(int i = 1; i <= N; i++) last[i] = upper_bound(p + 1, p + 1 + N, pii(0, p[i].S), [](pii i, pii j){return i.S < j.S; }) - p - 1; for(int p = 0; p + 1 < P; p++) { st.build(table[p]); for(int i = 1; i <= N; i++) table[p + 1][i] = st.query(table[p][i], last[i]); } // for(int p = 0; p < P; p++) // for(int i = 1; i <= N; i++) // cout << table[p][i] << " \n"[i == N]; for(int i = 1; i <= Q; i++) { int u, v; cin >> u >> v; if(u == v) ans[i] = -1; start[i] = order[u]; range[i] = pii(order[v], order[v]); } for(int p = P - 1; p >= 0; p--) { st.build(table[p]); for(int i = 1; i <= Q; i++) { pii nrange = pii(st.query(range[i].F, range[i].S), last[range[i].S]); // if(i == 1 || i == 2) cout << "query " << i << " " << p << " range " << range[i].F << " " << range[i].S << " -> " << nrange.F << " " << nrange.S << '\n'; if(start[i] < nrange.F || nrange.S < start[i]) { ans[i] += (1 << p); range[i] = nrange; } } } for(int i = 1; i <= Q; i++) if(ans[i] >= N) cout << "impossible\n"; else cout << ans[i] + 1 << '\n'; }
#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...