제출 #653567

#제출 시각아이디문제언어결과실행 시간메모리
653567AlperenTEvent Hopping (BOI22_events)C++17
0 / 100
95 ms14212 KiB
#include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; int n, q, where[N], pref[N], tin[N], tout[N], tim, depth[N]; struct Event{ int l, r; bool operator < (const Event &sc) const{ if(r == sc.r) return l < sc.l; else return r < sc.r; } }; Event arr[N]; vector<pair<Event, int>> v; vector<int> tree[N]; void dfs(int v, int p){ tin[v] = ++tim; depth[v] = depth[p] + 1; for(auto e : tree[v]){ if(e != p) dfs(e, v); } tout[v] = ++tim; } bool isanc(int a, int b){ return (tin[a] <= tin[b] && tout[a] >= tout[b]); } int main(){ ios_base::sync_with_stdio(false);cin.tie(NULL); cin >> n >> q; for(int i = 1; i <= n; i++) cin >> arr[i].l >> arr[i].r; for(int i = 1; i <= n; i++) v.push_back({arr[i], i}); sort(v.begin(), v.end()); set<pair<int, int>> st; for(auto p : v){ while(!st.empty() && prev(st.end())->first >= p.first.l){ tree[p.second].push_back(prev(st.end())->second); st.erase(prev(st.end())); } st.insert({p.first.r, p.second}); } dfs(v.back().second, 0); while(q--){ int s, e; cin >> s >> e; if(isanc(e, s)) cout << depth[s] - depth[e] << "\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...