Submission #1266584

#TimeUsernameProblemLanguageResultExecution timeMemory
1266584warrennEvent Hopping (BOI22_events)C++20
20 / 100
305 ms34336 KiB
#include<bits/stdc++.h> using namespace std; #define int long long const int maxn=1e5; int n,qu; int s[maxn+2],e[maxn+2]; map<int,int>conv; vector<pair<int,int> >st; pair<int,int>hmm[maxn+2]; pair<int,int>merg(pair<int,int>a,pair<int,int> b){ if(a.first<b.first)return a; return b; } void build(int idx,int l,int r){ if(l==r){ st[idx]=hmm[l]; return; } int mid=(l+r)/2; build(2*idx,l,mid); build(2*idx+1,mid+1,r); st[idx]=merg(st[2*idx],st[2*idx+1]); } pair<int,int> query(int idx,int l,int r,int posl,int posr){ if(l>posr || r<posl)return {1e18,0}; if(l>=posl && r<=posr)return st[idx]; int mid=(l+r)/2; return merg(query(2*idx,l,mid,posl,posr),query(2*idx+1,mid+1,r,posl,posr)); } signed main(){ cin>>n>>qu; st=vector<pair<int,int> >(4*n+1); vector<int>res; for(int q=1;q<=n;q++){ cin>>s[q]>>e[q]; res.push_back(e[q]); } sort(res.begin(),res.end()); res.erase(unique(res.begin(),res.end()),res.end()); int cnt=1; for(int q=0;q<res.size();q++){ if(q==0 || res[q]!=res[q-1]){ conv[res[q]]=cnt; cnt++; } } for(int q=1;q<=n;q++){ int hah=conv[e[q]]; if(hmm[hah].first==0 || hmm[hah].first>s[q]){ hmm[hah]={s[q],q}; } } build(1,1,n); int bin[n+2][21]; for(int q=1;q<=n;q++){ int l=0; int r=res.size()-1; int awal=0; while(l<=r){ int mid=(l+r)/2; if(res[mid]>=s[q]){ awal=mid; r=mid-1; } else{ l=mid+1; } } l=0; r=res.size()-1; int akh=0; while(l<=r){ int mid=(l+r)/2; if(res[mid]<=e[q]){ akh=mid; l=mid+1; } else{ r=mid-1; } } bin[q][0]=query(1,1,n,awal+1,akh+1).second; } for(int lvl=1;lvl<=20;lvl++){ for(int idx=1;idx<=n;idx++){ bin[idx][lvl]=bin[bin[idx][lvl-1]][lvl-1]; } } while(qu--){ int u,v; cin>>u>>v; if(u==v){ cout<<0<<endl; continue; } if(s[v]>=s[u] && s[v]<=e[u]){ cout<<1<<endl; continue; } if(e[v]<e[u]){ cout<<"impossible"<<endl; continue; } int ans=0; for(int lvl=20;lvl>=0;lvl--){ if(s[bin[v][lvl]]>e[u]){ ans+=(1<<lvl); v=bin[v][lvl]; } } if(s[bin[v][0]]>e[u]){ cout<<"impossible"<<endl; continue; } cout<<ans+2<<endl; } }
#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...