// Source: https://usaco.guide/general/io
#include <bits/stdc++.h>
using namespace std;
int n, q, par[20][100005];
pair <int, pair <int, int> > a[100005];
int s[100005], e[100005], p[100005];
struct node{
int s, e, m;
pair <int, int> val;
node *l, *r;
node (int _s, int _e){
s = _s, e = _e, m = (s + e) >> 1;
if (s != e)l = new node(s, m), r = new node(m + 1, e), val = min(l->val, r->val);
else val = {a[s].second.first, s};
}
pair <int, int> qry(int a, int b){
if (a == s && b == e)return val;
else if(b <= m) return l->qry(a, b);
else if(a> m) return r->qry(a,b);
else return min(l->qry(a,m), r->qry(m+1,b));
}
}*root;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++) {
cin >> a[i].second.first >> a[i].first, a[i].second.second = i;
s[i] = a[i].second.first;
e[i] = a[i].first;
p[i] = i;
}
sort (a + 1, a + n + 1);
root=new node(1,n);
priority_queue<pair <int, pair <int, int> > > pq;
for (int i = 1; i <= n; i++) {
int lo = 1, hi = i - 1, ans = hi + 1;
while (lo <= hi) {
int mid = (lo + hi) >> 1;
if (a[mid].first >= a[i].second.first) ans = mid, hi = mid - 1;
else lo = mid + 1;
}
pair <int, int> res = root->qry(ans, i);
par[0][i] = (i== res.second?0:res.second);
}
for (int i = 1; i <= 19; i++) {
for (int j = 1; j <= n; j++) par[i][j] = par[i - 1][par[i - 1][j]];
}
while (q--) {
int l, r; cin >> l >> r;
if (l == r) {
cout << 0 << '\n';
continue;
}
else if (s[r] <= e[l] && e[l] <= e[r]) {
cout << 1 << '\n';
continue;
}
int cur = r, ans = 0;
for (int i = 19; i >= 0; i--) {
int x = par[i][cur];
if (!x) continue;
if (e[x] < e[l]) continue;
if (s[x] > e[l]) ans += (1<<i), cur = x;
}
if (par[0][cur]) {
/*
cur = par[0][cur];
if (e[cur] >= s[r] && e[cur] <= e[r]) cout << ans + 2 << '\n';
else cout << "impossible\n";
*/
cout << ans + 2 << '\n';
}
else cout << "impossible\n";
}
}
| # | 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... |