Submission #653573

#TimeUsernameProblemLanguageResultExecution timeMemory
653573AlperenTEvent Hopping (BOI22_events)C++17
10 / 100
95 ms14500 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]; bool vis[N]; void dfs(int v, int p){ tin[v] = ++tim; depth[v] = depth[p] + 1; vis[v] = true; 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]); } bool canmove(Event a, Event b){ return b.l <= a.r && a.r <= b.r; } 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}); } for(int i = n - 1; i >= 0; i--){ if(!vis[v[i].second]){ dfs(v[i].second, 0); } } while(q--){ int s, e; cin >> s >> e; if(isanc(e, s)) cout << depth[s] - depth[e] << "\n"; else{ if(canmove(arr[s], arr[e])) cout << 1 << "\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...