#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=(int)1e5;
const int INF=(int)1e9;
int s[N+2],e[N+2],l[N+2],r[N+2];
int n,q,limit_size;
vector<int>pp;
vector<int>nen;
int Find(int x){
return upper_bound(nen.begin(),nen.end(),x)-nen.begin();
}
namespace subtask2{
bool check(){
return n<=5000;
}
vector<pair<int,int>>quest[N+2];
vector<int>toado[N+2];
int ans[N+2];
void main_code(){
for(int i=1;i<=q;++i) {
if (l[i]==r[i]){
ans[i]=0;
continue;
}
if (e[l[i]]>e[r[i]]){
ans[i]=INF;
continue;
}
quest[r[i]].push_back({l[i],i});
}
for(int i=1;i<=n;++i) toado[s[i]].push_back(e[i]);
for(int i=1;i<=n;++i) {
if (quest[i].size()==0) continue;
int a=s[i],b=e[i];
int total=-1;
vector<int>jmp(limit_size+2,-1);
vector<int>dp(limit_size+2,INF);
dp[b+1]=0;
for(int j=1;j<=b;++j){
for(auto&x:toado[j]){
if (x<=b) total=max(total,x);
if (j==a) total=b+1;
}
if (total>=j) jmp[j]=total;
}
for(int j=b;j>=0;--j) {
if (jmp[j] && dp[jmp[j]]!=INF) {
dp[j]=1+dp[jmp[j]];
}
}
for(auto&x:quest[i]) ans[x.second]=dp[e[x.first]];
}
for(int i=1;i<=q;++i) {
if (ans[i]>=INF) cout<<"impossible\n";
else cout<<ans[i]<<'\n';
}
return;
}
}
namespace subtask3{
bool check(){
return true;
}
const int MAXLOG=(int)17;
int par[N+2][MAXLOG+2];
int id[N+2];
int binary_jump(int x,int target){
if (id[x]>id[target]) return INF;
if (id[target]==id[x]) return 0;
x=id[x];
int ans=0;
for(int i=MAXLOG;i>=0;--i){
if (par[x][i]<id[target]){
ans+=(1<<i);
x=par[x][i];
}
}
for(int i=0;i<=MAXLOG;++i){
if (par[x][i]>=id[target]){
return ans+(1<<i);
}
}
return INF;
}
void main_code(){
for(int i=0,j=0;i<pp.size();++i){
while (j<pp.size() && s[pp[j]]<=e[pp[i]] && e[pp[i]]<=e[pp[j]]) ++j;
par[i][0]=j-1;
id[pp[i]]=i;
}
for(int j=1;j<=MAXLOG;++j){
for(int i=0;i<n;++i){
par[i][j]=par[par[i][j-1]][j-1];
}
}
for(int i=1;i<=q;++i){
int k=binary_jump(l[i],r[i]);
if (k>=INF) cout<<"impossible\n";
else cout<<k<<'\n';
}
return;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0) ; cout.tie(0);
#define task "main"
if (fopen(task".inp","r")){
freopen(task".inp","r",stdin);
freopen(task".out","w",stdout);
}
cin>>n>>q;
for(int i=1;i<=n;++i) cin>>s[i]>>e[i];
for(int i=1;i<=q;++i) cin>>l[i]>>r[i];
for(int i=1;i<=n;++i) {
nen.push_back(s[i]);
nen.push_back(e[i]);
}
sort(nen.begin(),nen.end());
nen.resize(unique(nen.begin(),nen.end())-nen.begin());
limit_size=nen.size();
for(int i=1;i<=n;++i){
s[i]=Find(s[i]) , e[i]=Find(e[i]);
pp.push_back(i);
}
sort(pp.begin(),pp.end(),[&](int x,int y){
if (s[x]!=s[y]) return s[x]<s[y];
return e[x]<e[y];
});
if (subtask2::check()) return subtask2::main_code(),0;
// if (subtask1::check()) return subtask1::main_code(),0;
if (subtask3::check()) return subtask3::main_code(),0;
return 0;
}
Compilation message (stderr)
events.cpp: In function 'int main()':
events.cpp:127:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
127 | freopen(task".inp","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
events.cpp:128:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
128 | freopen(task".out","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
# | 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... |