#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
const int MAXN = 2e5 + 10, INF = 1e6;
int n, l[MAXN], r[MAXN], lc[4 * MAXN], rc[4 * MAXN], d[3][4 * MAXN], cnt;
bool seen[3][4 * MAXN];
vector<pair<int, int>> adj[4 * MAXN];
void input() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> l[i] >> r[i];
--l[i];
}
cnt = n + 1;
}
void make(int u, int l, int r) {
if (r - l == 1) {
adj[l].push_back({u, 0});
return;
}
int mid = (l + r) / 2;
lc[u] = cnt++;
rc[u] = cnt++;
adj[lc[u]].push_back({u, 0});
adj[rc[u]].push_back({u, 0});
make(lc[u], l, mid);
make(rc[u], mid, r);
}
void add_edge(int u, int l, int r, int s, int e, int i) {
if (s <= l && r <= e) {
adj[u].push_back({i, 1});
return;
}
if (e <= l || r <= s)
return;
int mid = (l + r) / 2;
add_edge(lc[u], l, mid, s, e, i);
add_edge(rc[u], mid, r, s, e, i);
}
void dij(int t) {
priority_queue<pii, vector<pii>, greater<pii>> q;
if (t == 0) {
q.push({0, 0}); d[t][0] = 0;
}
if (t == 1) {
q.push({0, n - 1}); d[t][n - 1] = 0;
}
if (t == 2)
for (int i = 0; i < n; i++)
q.push({d[t][i], i});
while (!q.empty()) {
int u = q.top().second, d1 = q.top().first; q.pop();
if (!seen[t][u]) {
seen[t][u] = true;
for (auto p : adj[u]) {
int v = p.first, d2 = d1 + p.second;
if (d2 < d[t][v]) {
d[t][v] = d2;
q.push({d2, v});
}
}
}
}
}
void findAns() {
for (int i = 0; i < cnt; i++)
d[0][i] = d[1][i] = d[2][i] = INF;
dij(0);
dij(1);
for (int i = 0; i < n; i++)
d[2][i] = (d[0][i] + d[1][i] - (i != 0 && i != (n - 1)));
dij(2);
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
input();
make(n, 0, n);
for (int i = 0; i < n; i++)
add_edge(n, 0, n, l[i], r[i], i);
findAns();
int q; cin >> q;
for (int i = 0; i < q; i++) {
int x; cin >> x; --x;
cout << (d[2][x] >= MAXN? -1: d[2][x]) << '\n';
}
return 0;
}
| # | 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... |