제출 #578436

#제출 시각아이디문제언어결과실행 시간메모리
578436abdzagEvent Hopping (BOI22_events)C++17
100 / 100
633 ms49236 KiB
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const long long inf=1e16;
struct Tree {
	typedef pair<int,int> T;
	static constexpr T unit = {INT_MAX,INT_MAX};
	T f(T a, T b) { return min(a, b); } // (any associative fn)
	vector<T> s; int n;
	Tree(int _n) {
        n=_n;
        s.assign(2*n,{INT_MAX,INT_MAX});
    }
	void update(int pos, T val) {
		for (s[pos += n] = val; pos /= 2;)
			s[pos] = f(s[pos * 2], s[pos * 2 + 1]);
	}
	T query(int b, int e) { // query [b, e)
		T ra = unit, rb = unit;
		for (b += n, e += n; b < e; b /= 2, e /= 2) {
			if (b % 2) ra = f(ra, s[b++]);
			if (e % 2) rb = f(s[--e], rb);
		}
		return f(ra, rb);
	}
};
int main(){
    ll n,q;
    cin>>n>>q;
    map<ll,ll> mapping;
    Tree tree(2*n+10);
    vector<pair<ll,ll>> v(n);
    set<ll> coords;
    for(int i=0;i<n;i++)cin>>v[i].first>>v[i].second;
    for(int i=0;i<n;i++)coords.insert(v[i].first),coords.insert(v[i].second);
    ll l=0;
    for(auto a: coords)mapping[a]=l++;
    for(int i=0;i<n;i++){
        v[i].first=mapping[v[i].first];
        v[i].second=mapping[v[i].second];
        if(tree.query(v[i].second,v[i].second+1).first>v[i].first)tree.update(v[i].second,{v[i].first,i});
    }
    ll LOG=23;
    // Building the edges doesn't work properly.
    //Some intervals are getting self loops and I am not adding end points correcctly
    vector<vector<ll>> p(n,vector<ll>(LOG));
    for(int i=0;i<n;i++){
        pair<ll,ll> cur=tree.query(v[i].first,v[i].second+1);
        if(cur.first>=v[i].first){
            p[i][0]=i;
        }
        else p[i][0]=cur.second;
    }
    for(int j=1;j<LOG;j++){
        for(int i=0;i<n;i++)p[i][j]=p[p[i][j-1]][j-1];
    }
    for(int i=0;i<q;i++){
        ll s,f;
        cin>>s>>f;
        s--,f--;
        if(s==f){
            cout<<0<<endl;
            continue;
        }
        if(v[s].second>v[f].second){
            cout<<"impossible"<<endl;
            continue;
        }
        if(v[s].second>=v[f].first){
            cout<<1<<endl;
            continue;
        }
        ll ans=2,cur=f;
        for(int i=LOG-1;i>=0;i--){
            if(v[p[cur][i]].first>v[s].second){
                ans+=(1<<i);
                cur=p[cur][i];
            }
        }
        if(v[p[cur][0]].first<=v[s].second)cout<<ans<<endl;
        else cout<<"impossible"<<endl;
    }
    return 0;
}
/*
3 1
7 14
1 6
3 8
2 1
*/
#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...