Submission #604826

#TimeUsernameProblemLanguageResultExecution timeMemory
604826errorgornEvent Hopping (BOI22_events)C++17
100 / 100
325 ms48580 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define ii pair<int,int> #define fi first #define se second #define endl '\n' #define puf push_front #define pof pop_front #define pub push_back #define pob pop_back #define lb lower_bound #define ub upper_bound #define rep(x,s,e) for (int x=(s)-((s)>(e));x!=(e)-((s)>(e));((s)<(e))?x++:x--) #define all(x) (x).begin(),(x).end() #define sz(x) (int) (x).size() mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); struct node{ int s,e,m; ii val=ii(1e9,-1); 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); } } void update(int i,ii k){ val=min(val,k); if (s==e) return; if (i<=m) l->update(i,k); else r->update(i,k); } ii query(int i,int j){ if (s==i && e==j) return val; else if (j<=m) return l->query(i,j); else if (m<i) return r->query(i,j); else return min(l->query(i,m),r->query(m+1,j)); } } *root=new node(0,200005); int n,q; ii range[100005]; int tkd[100005][18]; signed main(){ cin.tie(0); cout.tie(0); cin.sync_with_stdio(false); cin>>n>>q; rep(x,1,n+1) cin>>range[x].fi>>range[x].se; vector<int> uni; rep(x,1,n+1) uni.pub(range[x].fi),uni.pub(range[x].se); sort(all(uni)); rep(x,1,n+1){ range[x].fi=lb(all(uni),range[x].fi)-uni.begin(); range[x].se=lb(all(uni),range[x].se)-uni.begin(); } rep(x,1,n+1) root->update(range[x].se,ii(range[x].fi,x)); vector<int> idx; rep(x,1,n+1) idx.pub(x); sort(all(idx),[](int i,int j){ return range[i].fi<range[j].fi; }); memset(tkd,-1,sizeof(tkd)); for (auto it:idx){ tkd[it][0]=root->query(range[it].fi,range[it].se).se; if (range[tkd[it][0]].fi==range[it].fi) tkd[it][0]=-1; int curr=tkd[it][0]; //cout<<it<<" "<<tkd[it][0]<<endl; rep(x,0,18){ if (curr==-1) break; curr=tkd[it][x+1]=tkd[curr][x]; } } int a,b; while (q--){ cin>>a>>b; if (a==b) cout<<0<<endl; else if (range[b].se<range[a].se) cout<<"impossible"<<endl; else if (range[b].fi<=range[a].se && range[a].se<=range[b].se) cout<<1<<endl; else{ int ans=0; rep(x,18,0) if (tkd[b][x]!=-1 && range[a].se<range[tkd[b][x]].fi){ b=tkd[b][x]; ans+=(1<<x); } if (tkd[b][0]!=-1) cout<<ans+2<<endl; else cout<<"impossible"<<endl; } } }

Compilation message (stderr)

events.cpp: In constructor 'node::node(long long int, long long int)':
events.cpp:29:16: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   29 |   s=_s,e=_e,m=s+e>>1;
      |               ~^~
#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...