// 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];
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;
}
sort (a + 1, a + n + 1, greater<>());
priority_queue<pair <int, pair <int, int> > > pq;
for (int i = 1; i <= n; i++) {
while (!pq.empty() && pq.top().second.first > a[i].first) pq.pop();
if (!pq.empty()) {
par[0][a[i].second.second] = pq.top().second.second;
}
else par[0][a[i].second.second] = 0;
pq.push(a[i]);
}
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 = l, ans = 0;
for (int i = 19; i >= 0; i--) {
int x = par[i][cur];
if (!x) continue;
if (e[x] > e[r]) continue;
if (e[x] < s[r]) 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";
}
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... |