제출 #1189108

#제출 시각아이디문제언어결과실행 시간메모리
1189108user149Event Hopping (BOI22_events)C++20
0 / 100
1602 ms217796 KiB
#include<bits/stdc++.h> using namespace std; using pii=pair<int,int>; struct st{ int l,r; pii val={-1,-1}; // {e,node} st* left=0; st* right=0; st(int L,int R){ l=L; r=R; } void create(){ if(l==r || left!=0) return; int mid=(l+r)/2; left=new st(l,mid); right=new st(mid+1,r); } void update(int i,pii v){ create(); if(l>i || r<i) return; if(l==r){ val=max(val,v); return; } left->update(i,v); right->update(i,v); val=max(left->val,right->val); }; pii query(int a,int b){ create(); if(l>b || r<a) return {-1,-1}; if(a<=l && r<=b) return val; return max(left->query(a,b),right->query(a,b)); } }; int s[100005]; int e[100005]; st segtree(0,1e9+5); int par[100005]; int main(){ int N,Q; cin>>N>>Q; for(int i=1;i<=N;i++){ cin>>s[i]>>e[i]; segtree.update(s[i],{e[i],i}); } for(int i=1;i<=N;i++){ auto [end,node]=segtree.query(0,e[i]); if(end>e[i]) par[i]=node; else par[i]=-1; } for(int i=1;i<=Q;i++){ int a,b; cin>>a>>b; if(a==b){ cout<<"0\n"; continue; } int ans=0; while(par[a]!=-1 && e[par[a]]<e[b]){ a=par[a]; ans++; } if(s[b]<=e[a] && e[a]<=e[b]){ cout<<ans+1<<'\n'; } else{ a=par[a]; ans++; if(s[b]<=e[a] && e[a]<=e[b]){ cout<<ans+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...