// Source:
#include "bits/stdc++.h"
using namespace std;
#define s second
#define f first
#define pb push_back
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<pii> vpii;
typedef vector<int> vi;
#define FOR(i, a, b) for (int i = (a); i<b; i++)
bool ckmin(int& a, int b){ return b < a ? a = b, true : false; }
bool ckmax(int& a, int b){ return b > a ? a = b, true : false; }
const int N = 2e5 + 10;
vpii adj[6 * N];
vi d1(6 * N, N + 1);
vi dn(6 * N, N + 1);
vi db(6 * N, N + 1);
int n;
void connect(int ul, int ur, int node, int i = 1, int l = 1, int r = n+1) {
if (r <= ul || ur <= l) return;
if (r <= ur && l >= ul) {
adj[i + 2*n].pb({node, 0});
return;
}
int m = (l + r)/2;
connect(ul, ur, node, 2*i, l, m);
connect(ul, ur, node, 2*i+1, m, r);
}
void build(int i = 1, int l = 1, int r = n+1) {
if (r - l == 1) {
adj[l].pb({i + 2*n, 0});
return;
}
int m = (l + r)/2;
adj[2*i + 2*n].pb({i + 2*n, 0});
adj[2*i+1 + 2*n].pb({i + 2*n, 0});
build(2*i, l, m);
build(2*i+1, m, r);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
build();
vi all;
FOR(i, 1, n+1) {
adj[i + n].pb({i, 1});
int l, r;
cin >> l >> r;
if (l == 1 && r == n) all.pb(i);
connect(l, r+1, i+n);
}
deque<int> d;
d.push_back(1);
d1[1]=0;
while (!d.empty()) {
int cur = d.front();
d.pop_front();
for (auto val: adj[cur]) {
if (d1[val.f] > d1[cur] + val.s) {
d1[val.f] = d1[cur] + val.s;
if (val.s == 0) d.push_front(val.f);
else d.push_back(val.f);
}
}
}
d.push_back(n);
dn[n]=0;
while (!d.empty()) {
int cur = d.front();
d.pop_front();
// cout << cur << dn[cur] << endl;
for (auto val: adj[cur]) {
if (dn[val.f] > dn[cur] + val.s) {
dn[val.f] = dn[cur] + val.s;
if (val.s == 0) d.push_front(val.f);
else d.push_back(val.f);
}
}
}
for (auto ax: all) {
d.push_back(ax);
db[ax]=0;
}
while (!d.empty()) {
int cur = d.front();
d.pop_front();
// cout << cur << dn[cur] << endl;
for (auto val: adj[cur]) {
if (db[val.f] > db[cur] + val.s) {
db[val.f] = db[cur] + val.s;
if (val.s == 0) d.push_front(val.f);
else d.push_back(val.f);
}
}
}
int q;
cin >> q;
FOR(_, 0, q) {
int x;
cin >> x;
int res = min(1 + db[x], d1[x] + dn[x] - (x != 1 && x != n));
if (res > n) cout << -1 << endl;
else cout << res << endl;
}
}
# | 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... |