제출 #1316328

#제출 시각아이디문제언어결과실행 시간메모리
1316328penguin133Event Hopping (BOI22_events)C++17
0 / 100
53 ms20976 KiB
// Source: https://usaco.guide/general/io #include <bits/stdc++.h> using namespace std; int n, q, par[20][100005]; pair <int, pair <int, int> > a[100005]; int s[100005], e[100005], p[100005]; struct node{ int s, e, m; pair <int, int> val; node *l, *r; node (int _s, int _e){ s = _s, e = _e, m = (s + e) >> 1; if (s != e)l = new node(s, m), r = new node(m + 1, e), val = min(l->val, r->val); else val = {a[s].second.first, s}; } pair <int, int> qry(int a, int b){ if (a == s && b == e)return val; else if(b <= m) return l->qry(a, b); else if(a> m) return r->qry(a,b); else return min(l->qry(a,m), r->qry(m+1,b)); } }*root; int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> q; for (int i = 1; i <= n; i++) { cin >> a[i].second.first >> a[i].first, a[i].second.second = i; s[i] = a[i].second.first; e[i] = a[i].first; p[i] = i; } sort (a + 1, a + n + 1); root=new node(1,n); priority_queue<pair <int, pair <int, int> > > pq; for (int i = 1; i <= n; i++) { int lo = 1, hi = i - 1, ans = hi + 1; while (lo <= hi) { int mid = (lo + hi) >> 1; if (a[mid].first >= a[i].second.first) ans = mid, hi = mid - 1; else lo = mid + 1; } pair <int, int> res = root->qry(ans, i); par[0][i] = (i== res.second?0:res.second); } for (int i = 1; i <= 19; i++) { for (int j = 1; j <= n; j++) par[i][j] = par[i - 1][par[i - 1][j]]; } while (q--) { int l, r; cin >> l >> r; if (l == r) { cout << 0 << '\n'; continue; } else if (s[r] <= e[l] && e[l] <= e[r]) { cout << 1 << '\n'; continue; } int cur = r, ans = 0; for (int i = 19; i >= 0; i--) { int x = par[i][cur]; if (!x) continue; if (e[x] < e[l]) continue; if (s[x] > e[l]) ans += (1<<i), cur = x; } if (par[0][cur]) { cur = par[0][cur]; if (e[l] >= s[cur] && e[l] <= e[cur]) cout << ans + 2 << '\n'; else cout << "impossible\n"; } else cout << "impossible\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...