Submission #901074

#TimeUsernameProblemLanguageResultExecution timeMemory
901074LCJLYEvent Hopping (BOI22_events)C++14
100 / 100
463 ms324816 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define ld long double
#define show(x,y) cout << y << " " << #x << endl;
#define show2(x,y,i,j) cout << y << " " << #x << "  " << j << " " << #i << endl;
#define show3(x,y,i,j,p,q) cout << y << " " << #x << "  " << j << " " << #i << "  " << q << " " << #p << endl; 
#define show4(x,y) for(auto it:x) cout << it << " "; cout << #y << endl;
typedef pair<long long,long long>pii;

inline pii combine(pii a, pii b){
	if(a.first<b.first) return a;
	return b;
}

struct node{
	int s,e,m;
	node *l,*r;
	pii v;
	
	node(int ss, int ee):s(ss),e(ee),m((s+e)>>1),l(NULL),r(NULL),v({INT_MAX,INT_MAX}){
	}
	
	inline void inst(){
		if(l==NULL)l=new node(s,m);
		if(r==NULL)r=new node(m+1,e);
	}
	
	void upd(int x, pii y){
		if(s==e){
			if(y.first<v.first){
				v=y;
			}
			return;
		}
		inst();
		if(x<=m)l->upd(x,y);
		else r->upd(x,y);
		v=combine(l->v,r->v);
	}
	
	pii query(int x, int y){
		if(x<=s&&y>=e){
			return v;
		}
		inst();
		if(y<=m)return l->query(x,y);
		if(x>m)return r->query(x,y);
		return combine(l->query(x,m),r->query(m+1,y));
	}
};

void solve(){	
	int n,q;
	cin >> n >> q;
	
	node st(0,1000000005);
	pii arr[n+1];
	for(int x=1;x<=n;x++){
		cin >>arr[x].first >> arr[x].second;
		st.upd(arr[x].second,{arr[x].first,x});
	}
	
	int two[25][n+5];
	memset(two,-1,sizeof(two));
	
	for(int x=1;x<=n;x++){
		pii hold=st.query(arr[x].first,arr[x].second);
		if(hold.first>=arr[x].first) continue;
		//show2(x,x,par,hold.second);
		two[0][x]=hold.second;
	}
	
	for(int x=0;x<20;x++){
		for(int y=1;y<=n;y++){
			if(two[x][y]==-1) continue;
			two[x+1][y]=two[x][two[x][y]];
		}
	}
	
	int l,r;
	for(int x=0;x<q;x++){
		cin >> l >> r;
		
		if(arr[r].second<arr[l].second){
			cout << "impossible\n";
			continue;
		}
		else if(l==r){
			cout << 0 << "\n";
			continue;
		}
		else if(arr[r].first<=arr[l].second&&arr[r].second>=arr[l].second){
			cout << 1 << "\n";
			continue;
		}
		
		int ans=0;
		for(int bit=19;bit>=0;bit--){
			if(two[bit][r]==-1) continue;
			int index=two[bit][r];
			if(arr[index].first>arr[l].second){
				ans+=1<<bit;
				r=index;
			}
		}
		//show(r,r);
		
		if(two[0][r]==-1||arr[two[0][r]].first>arr[l].second){
			cout << "impossible\n";
			continue;
		}
		
		cout << ans+2 << "\n";
	}
	
	
}	

int32_t main(){										
	ios::sync_with_stdio(0);	
	cin.tie(0);
	int t=1;
	//cin >> t;
	while(t--){
		solve();
	}
}

		
#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...