#include<bits/stdc++.h>
#define MAXN 400007
using namespace std;
struct event{
long long s;
long long e;
int id;
inline friend bool operator < (event fr,event sc){
if(fr.e!=sc.e)return fr.e<sc.e;
return fr.s<=sc.s;
}
};
int n,cnt,q,S,E,ans;
int st[MAXN],et[MAXN];
int pos[MAXN],parent[MAXN];
event e[MAXN];
vector<int> w;
map<int,int> mp;
pair<int,int> mins[8*MAXN];
pair<int,int> best(pair<int,int> fr,pair<int,int> sc){
if(fr.second<=sc.second)return fr;
return sc;
}
void update(int v,int l,int r,int pos,int val,int id){
if(l==r){
if(val<mins[v].second or val==10000000){
mins[v]={id,val};
}
}else{
int tt=(l+r)/2;
if(pos<=tt)update(2*v,l,tt,pos,val,id);
else update(2*v+1,tt+1,r,pos,val,id);
mins[v]=best(mins[2*v],mins[2*v+1]);
}
}
pair<int,int> getmin(int v,int l,int r,int ll,int rr){
if(ll>rr)return {0,100000000};
if(l==ll and r==rr){
return mins[v];
}else{
int tt=(l+r)/2;
return best( getmin(2*v,l,tt,ll,min(tt,rr)) , getmin(2*v+1,tt+1,r,max(tt+1,ll),rr) );
}
}
int dp[MAXN][20];
void calc(){
for(int i=1;i<=n;i++){
for(int f=0;f<20;f++){
if(f==0)dp[i][f]=parent[i];
else dp[i][f]=dp[dp[i][f-1]][f-1];
}
}
}
int bin(int id,int id2){
if(id==id2)return 0;
if(et[id]<st[id2])return -1;
if(et[id2]>et[id])return -1;
if(et[id2]>=st[id])return 1;
int res=0;
for(int i=19;i>=0;i--){
if(dp[id][i]!=0 and st[dp[id][i]]>et[id2]){
id=dp[id][i];
res+=(1<<i);
}
}
if(parent[id]==0)return -1;
if(parent[id]==id2)return res+1;
return res+2;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>st[i]>>et[i];
e[i]={st[i],et[i],i};
w.push_back(e[i].s);
w.push_back(e[i].e);
}
sort(w.begin(),w.end());
for(int i=0;i<w.size();i++){
if(i>0 and w[i]!=w[i-1])cnt++;
mp[w[i]]=cnt;
}
for(int i=1;i<=n;i++){
e[i].s=mp[e[i].s];
e[i].e=mp[e[i].e];
pos[e[i].id]=i;
}
for(int i=0;i<=cnt;i++){
update(1,0,cnt,i,10000000,0);
}
sort(e+1,e+n+1);
for(int i=1;i<=n;i++){
parent[e[i].id]=getmin(1,0,cnt,e[i].s,e[i].e).first;
update(1,0,cnt,e[i].e,e[i].s,e[i].id);
}
calc();
for(int i=1;i<=q;i++){
cin>>S>>E;
ans=bin(E,S);
if(ans==-1)cout<<"impossible\n";
else cout<<ans<<"\n";
}
return 0;
}
Compilation message
events.cpp: In function 'int main()':
events.cpp:99:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
99 | for(int i=0;i<w.size();i++){
| ~^~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
340 KB |
Output is correct |
2 |
Incorrect |
194 ms |
19744 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
340 KB |
Output is correct |
2 |
Correct |
0 ms |
340 KB |
Output is correct |
3 |
Incorrect |
2 ms |
468 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
340 KB |
Output is correct |
2 |
Correct |
0 ms |
340 KB |
Output is correct |
3 |
Incorrect |
2 ms |
468 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
340 KB |
Output is correct |
2 |
Correct |
0 ms |
340 KB |
Output is correct |
3 |
Incorrect |
2 ms |
468 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
195 ms |
19780 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
0 ms |
340 KB |
Output is correct |
2 |
Incorrect |
194 ms |
19744 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |