#include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
const int maxn = 2e5 + 5;
int n, L[maxn], R[maxn], id[maxn], D[4*maxn][3];
vector<pii> G[4*maxn];
void build(int u, int tl, int tr) {
if(tl == tr) {
id[tl] = u;
} else {
int tm = (tl + tr) / 2;
build(2*u, tl, tm);
build(2*u+1, tm+1, tr);
G[2*u].push_back({ u, 0 });
G[2*u+1].push_back({ u, 0 });
}
}
void add(int u, int tl, int tr, int s) {
if(L[s] > tr || tl > R[s]) return ;
if(L[s] <= tl && tr <= R[s]) {
G[u].push_back({ id[s], 1 });
return ;
}
int tm = (tl + tr) / 2;
add(2*u, tl, tm, s);
add(2*u+1, tm+1, tr, s);
}
void bfs(int t, int s) {
priority_queue<pii, vector<pii>, greater<> > pq;
for(int i=1; i<=4*n; i++) pq.push({ D[i][t], i });
while(!pq.empty()) {
auto [d, u] = pq.top(); pq.pop();
if(D[u][t] != d) continue;
for(auto [v, w] : G[u])
if(D[v][t] > d + w) pq.push({ D[v][t] = d + w, v });
}
}
signed main() {
cin >> n;
build(1, 1, n);
for(int j=0; j<3; j++)
for(int i=1; i<=4*n; i++) D[i][j] = 1e6;
for(int i=1; i<=n; i++) {
cin >> L[i] >> R[i];
if(L[i] == 1) D[id[i]][0] = 0;
if(R[i] == n) D[id[i]][1] = 0;
add(1, 1, n, i);
}
bfs(0, 1);
bfs(1, n);
for(int i=1; i<=n; i++)
D[id[i]][2] = D[id[i]][0] + D[id[i]][1] + 1;
bfs(2, n);
int q; cin >> q;
while(q--) {
int x; cin >> x;
cout << (D[id[x]][2] < 1e6 ? D[id[x]][2] : -1) << '\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... |