#include <bits/stdc++.h>
#define ar array
#define all(x) x.begin(), x.end()
using namespace std;
typedef long long ll;
struct segtree {
vector <ar <int, 2>> t;
int n;
void init(int sz) {
n = sz; sz += 5;
t.assign(sz, {(int)1e9, 0});
}
int qi, qx;
ar <int, 2> merge(const ar <int, 2> &a, const ar <int, 2> &b) {
if (a[0] < b[0])
return a;
return b;
}
void update(int v, int l, int r) {
if (l == r)
return t[v] = {qx, l}, void();
int m = l + r >> 1;
if (qi <= m)
update(v << 1, l, m);
else
update(v << 1 | 1, m + 1, r);
t[v] = merge(t[v << 1], t[v << 1 | 1]);
}
void update(int i, int x) {
qi = i, qx = x;
update(1, 1, n);
}
int ql, qr;
ar <int, 2> get(int v, int l, int r) {
if (ql <= l && r <= qr)
return t[v];
if (ql > r || l > qr)
return t[0];
int m = l + r >> 1;
return merge(get(v << 1, l, m), get(v << 1 | 1, m + 1, r));
}
int get(int l, int r) {
ql = l, qr = r;
return get(1, 1, n)[1];
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int n;
cin >> n;
vector <ar <int, 2>> rng(n + 1);
vector <vector <int>> dp(n + 1, vector <int> (n + 1, 1e9));
dp[1][n] = 0;
segtree st[2];
st[0].init(n);
st[1].init(n);
for (int i = 1; i <= n; i++)
cin >> rng[i][0] >> rng[i][1], st[0].update(i, rng[i][0]), st[1].update(i, -rng[i][1]);
for (int add = n - 2; add >= 0; add--) {
for (int l = 1; l + add <= n; l++) {
int r = l + add;
int tl = st[0].get(l, r), tr = st[1].get(l, r);
dp[l][r] = min(dp[rng[tl][0]][rng[tl][1]], dp[rng[tr][0]][rng[tr][1]]) + 1;
}
}
int q;
cin >> q;
while (q--) {
int x;
cin >> x;
if (dp[x][x] <= n)
cout << dp[x][x] << '\n';
else
cout << -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... |