Submission #796757

#TimeUsernameProblemLanguageResultExecution timeMemory
796757fuad27Event Hopping (BOI22_events)C++17
100 / 100
247 ms44280 KiB
#include<bits/stdc++.h> using namespace std; #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") const int N=200'010; const int LG=20; struct event { int s, e, idx; }; event es[N]; struct Binary_Lifting { int up[N][LG]; void add(int node, int par) { up[node][0]=par; for(int i = 1;i<LG;i++) { up[node][i]=up[up[node][i-1]][i-1]; } } int get(int start, int num) { if(es[start].e>=num)return 1; int res=1; for(int i = LG-1;i>=0;i--) { if(es[up[start][i]].e<num) { start=up[start][i]; res+=(1<<i); } } if(es[up[start][0]].e>=num)return res+1; return -1; } }; bool operator<(const event &a, const event &b) { return a.e>b.e; } Binary_Lifting bl; vector<int> child[N]; int out[N]; void dfs(int at) { for(int to:child[at]){ bl.add(to,at); dfs(to); } } pair<int,int> T[4*N]; void update(int at, pair<int,int> val, int tl=0, int tr=N-1, int v=1) { if(tl==tr) { T[v]=max(T[v], val); return; } int tm=(tl+tr)/2; if(at<=tm) { update(at, val, tl,tm,2*v); } else update(at, val, tm+1,tr,2*v+1); T[v]=max(T[2*v],T[2*v+1]); } pair<int,int> query(int l, int r, int tl=0, int tr=N-1, int v=1) { if(tr<l or r<tl)return {-1,-1}; if(l<=tl and tr<=r)return T[v]; int tm=(tl+tr)/2; return max(query(l,r,tl,tm,2*v), query(l,r,tm+1,tr,2*v+1)); } int main () { cin.tie(0)->sync_with_stdio(0); int n, q; cin >> n >> q; map<int,int> cc; for(int i = 0;i<n;i++) { cin >> es[i].e >> es[i].s; es[i].s*=-1; es[i].e*=-1; cc[es[i].s]=1; cc[es[i].e]=1; es[i].idx=i; } vector<event> on[2*n], off[2*n]; { int cnt=0; for(auto &i:cc) { i.second=cnt++; } for(int i = 0;i<n;i++) { es[i].s=cc[es[i].s]; es[i].e=cc[es[i].e]; } } for(int i = 0;i<n;i++) { update(es[i].s, {es[i].e, i}); } for(int i = 0;i<n;i++) { pair<int,int> c=query(es[i].s, es[i].e); if(c.first>es[i].e){ child[c.second].push_back(i); out[i]++; } } for(int i = 0;i<n;i++) { if(out[i]==0){ bl.add(i,i); dfs(i); } } while(q--) { int s, e; cin >> s >> e; swap(s,e); if(es[s-1].s>es[e-1].s){ cout << "impossible" << "\n"; continue; } if(s==e) { cout << 0 << "\n"; continue; } int res=bl.get(s-1,es[e-1].s); if(res>=0)cout << res << "\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...