#include <bits/stdc++.h>
using namespace std;
#define int long long
#define speedIO ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
//#define mod 1000000007
#define f first
#define s second
#define pii pair<int,int>
#define pb push_back
vector<pii> seg,idk;
void build(int v, int l, int r){
//cout<<v<<'\n';
if(l>r) return;
if(l==r){
seg[v]=idk[l];
}else{
int m=(l+r)/2;
build(2*v,l,m);
build(2*v+1,m+1,r);
seg[v]=min(seg[2*v],seg[2*v+1]);
}
}
pii get(int v, int l, int r, int cl, int cr){
if(cl>cr){
return {1e18,-1};
}
if(l==cl and r==cr){
return seg[v];
}else{
int m=(l+r)/2;
return min(get(2*v,l,m,cl,min(cr,m)),get(2*v+1,m+1,r,max(m+1,cl),cr));
}
}
int32_t main(){
speedIO;
int t,n,m,k,q;
//cin>>t;
t=1;
while(t--){
cin>>n>>q;
int s[n],e[n];
vector<pii> start(n);
for(int i=0;i<n;i++){
cin>>s[i]>>e[i];
start[i]={e[i],i};
}
sort(start.begin(),start.end());
vector<int> best(n),bruh(n),pos(n);
vector<vector<int>> up(n,vector<int>(21));
idk.resize(n+1);
for(int i=0;i<n;i++){
idk[i+1].f=s[start[i].s];
idk[i+1].s=start[i].s;
pos[start[i].s]=i;
bruh[i]=start[i].f;
//cout<<idk[i+1].f<<' '<<idk[i+1].s<<'\n';
}
//cout<<'\n';
seg.resize(4*n+5,{0,-1});
build(1,1,n);
//cout<<get(1,1,n,6,7).f<<' '<<get(1,1,n,1,2).s<<'\n';
for(int i=0;i<n;i++){
int l=s[i],r=e[i];
int idx1=upper_bound(bruh.begin(),bruh.end(),r)-bruh.begin()-1;
int idx2=lower_bound(bruh.begin(),bruh.end(),l)-bruh.begin();
pii tmp=get(1,1,n,idx2+1,idx1+1);
best[i]=tmp.s;
/*if(best[i]==i){
best[i]=-1;
}*/
up[i][0]=best[i];
}
/*for(int i:best){
cout<<i<<' ';
}
cout<<'\n';*/
for(int i=0;i<n;i++){
for(int j=1;j<21;j++){
up[i][j]=up[up[i][j-1]][j-1];
}
}
while(q--){
int x,y;
cin>>x>>y;
x--;y--;
int ans=0;
bool flag=true;
if(x==y){
cout<<0<<'\n';
continue;
}
if(e[y]<e[x]){
cout<<"impossible\n";
continue;
}
if(s[y]<=e[x]){
if(e[y]>=e[x]){
cout<<1<<'\n';
continue;
}
}
for(int i=20;i>=0;i--){
if(s[up[y][i]]>e[x]){
y=up[y][i];
//cout<<y<<' ';
ans+=(1<<i);
}
}
//cout<<'\n';
y=best[y];
ans++;
//cout<<y<<' '<<best[y]<<'\n';
/*while(s[y]>e[x]){
ans++;
if(best[y]==-1){
flag=false;
break;
}
y=best[y];
cout<<y<<' ';
}
cout<<y<<'\n';*/
if(e[y]<e[x] or e[x]<s[y]){
flag=false;
}
if(flag){
cout<<ans+1<<'\n';
}else{
cout<<"impossible\n";
}
}
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |