Submission #603852

#TimeUsernameProblemLanguageResultExecution timeMemory
603852EvirirEvent Hopping (BOI22_events)C++17
0 / 100
966 ms104232 KiB
#include <bits/stdc++.h> //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> using namespace std; //using namespace __gnu_pbds; #pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx2") #define watch(x) cout<<(#x)<<"="<<(x)<<'\n' #define mset(d,val) memset(d,val,sizeof(d)) #define cbug if(DEBUG) cout #define setp(x) cout<<fixed<<setprecision(x) #define sz(x) (int)(x).size() #define all(x) begin(x), end(x) #define forn(i,a,b) for(int i=(a);i<(b);i++) #define fore(i,a,b) for(int i=(a);i<=(b);i++) #define pb push_back #define F first #define S second #define fbo find_by_order #define ook order_of_key typedef long long ll; typedef long double ld; typedef pair<int,int> ii; typedef vector<int> vi; typedef vector<ii> vii; //template<typename T> //using pbds = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; void SD(int t=0){ cout<<"PASSED "<<t<<endl; } ostream& operator<<(ostream &out, ii x){ out<<"("<<x.F<<","<<x.S<<")"; return out; } template<typename T> void amax(T &a, T b){ a=max(a,b); } template<typename T> void amin(T &a, T b){ a=min(a,b); } const ll INF = ll(1e18); const int MOD = 998244353; class PointSegmentTree{ private: int size_; vector<int> v; void update(int p, int val, int k, int l, int r) { if(p < l || r < p) return; if(l == r){ v[k]=val; //modification return; } int mid = (l+r)>>1; update(p, val, k*2, l, mid); update(p, val, k*2+1, mid+1, r); v[k] = merge(v[k*2], v[k*2+1]); } int query(int s, int e, int k, int l, int r) { if(e < l || r < s) return 0; //dummy value if(s <= l && r <= e) return v[k]; int mid = (l+r)>>1; int lc = query(s, e, k*2, l, mid); int rc = query(s, e, k*2+1, mid+1, r); return merge(lc, rc); } public: PointSegmentTree(): v(vector<int>()) {} PointSegmentTree(int n){ for(size_=1;size_<n;) size_<<=1; v.resize(size_*4); } //void reset(){} inline int merge(int x, int y){ return max(x, y); } inline void update(int p, int val){ update(p, val, 1, 0, size_-1); } inline int query(int l, int r){ return query(l, r, 1, 0, size_-1); } }; const bool DEBUG = 0; const int MAXN = 100005; const int MAXA = MAXN * 2; const int LG = 20; int n,Q; int s[MAXN], e[MAXN]; //reversed vii a,q,q0; int nxt[MAXA][LG]; PointSegmentTree st[LG]; vi comp; int getid(int x){ return sz(comp) - 1 - (lower_bound(all(comp), x) - comp.begin()); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); mset(nxt,-1); cin>>n>>Q; forn(i,0,n) { cin>>e[i]>>s[i]; comp.pb(s[i]); comp.pb(e[i]); a.pb({s[i], e[i]}); } forn(z,0,Q) { int u,v; cin>>u>>v; u--; v--; q0.pb({v, u}); q.pb({s[v], s[u]}); } // compress everything in reverse sort(all(comp)); forn(i,0,n) { s[i]=getid(s[i]); e[i]=getid(e[i]); a[i]={getid(a[i].F), getid(a[i].S)}; } forn(i,0,Q) q[i]={getid(q[i].F), getid(q[i].S)}; forn(i,0,MAXA) forn(j,0,LG) nxt[i][j]=i; forn(i,0,n) amax(nxt[s[i]][0], e[i]); forn(i,0,LG) st[i]=PointSegmentTree(MAXA); forn(i,0,MAXA) st[0].update(i, nxt[i][0]); for(int i=MAXA-1;i>=0;i--) { forn(j,1,LG) { nxt[i][j] = st[j-1].query(i, nxt[i][j-1]); st[j].update(i, nxt[i][j]); } } forn(z,0,Q) { if(q0[z].F==q0[z].S) { cout<<0<<'\n'; continue; } if(e[q0[z].F]>e[q0[z].S]) { cout<<"impossible\n"; continue; } int u=q[z].F, v=q[z].S; int ans=0; for(int j=LG-1;j>=0;j--) { if(nxt[u][j]<v) { u=nxt[u][j]; ans+=(1<<j); } } u=nxt[u][0]; ans++; if(u>=v) cout<<ans<<'\n'; else cout<<"impossible\n"; } return 0; }
#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...