#include "bits/stdc++.h"
using namespace std;
#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif
const int maxn = 5e5 + 5;
const int LG = 19;
int n, q;
int l[maxn], r[maxn];
int bl[maxn][LG + 1], br[maxn][LG + 1];
int L[maxn], R[maxn];
int a[maxn];
vector<int> rv[maxn];
int tree_min[maxn << 2], tree_max[maxn << 2];
void upd(int pos, int ind = 1, int l = 1, int r = n) {
if (l == r) {
tree_min[ind] = L[l];
tree_max[ind] = R[l];
return;
}
int mid = (l + r) >> 1;
if (pos <= mid) upd(pos, ind << 1, l, mid);
else upd(pos, ind << 1 | 1, mid + 1, r);
tree_max[ind] = max(tree_max[ind << 1], tree_max[ind << 1 | 1]);
tree_min[ind] = min(tree_min[ind << 1], tree_min[ind << 1 | 1]);
}
pair<int, int> get(int x, int y, int ind = 1, int l = 1, int r = n) {
if (l > y || r < x) return make_pair(n + 1, -1);
if (x <= l and r <= y) {
return make_pair(tree_min[ind], tree_max[ind]);
}
int mid = (l + r) >> 1;
auto le = get(x, y, ind << 1, l, mid), ri = get(x, y, ind << 1 | 1, mid + 1, r);
return make_pair(min(le.first, ri.first), max(le.second, ri.second));
}
void solve() {
cin >> n;
for (int i = 2; i <= n; ++i) {
cin >> a[i];
}
for (int i = 1; i <= n; ++i) {
int sz; cin >> sz;
for (int j = 1; j <= sz; ++j) {
int v; cin >> v;
rv[v].push_back(i);
}
}
for (int i = 1; i <= n; ++i) {
sort(rv[i].begin(), rv[i].end());
}
r[0] = n + 1;
for (int i = 1; i <= n; ++i) {
r[i] = n + 1;
if (i > 1) {
int x = lower_bound(rv[a[i]].begin(), rv[a[i]].end(), i) - rv[a[i]].begin();
if (x > 0) {
int u = rv[a[i]][x - 1];
l[i] = u;
}
}
if (i < n) {
int x = upper_bound(rv[a[i + 1]].begin(), rv[a[i + 1]].end(), i) - rv[a[i + 1]].begin();
if (x < (int)rv[a[i + 1]].size()) {
int u = rv[a[i + 1]][x];
r[i] = u;
}
}
bl[i][0] = l[i], br[i][0] = r[i];
}
for (int j = 1; j <= LG; ++j) {
for (int i = 1; i + (1 << j) <= n + 1; ++i) {
br[i][j] = max(br[i][j - 1], br[i + (1 << (j - 1))][j - 1]);
bl[i][j] = min(bl[i][j - 1], bl[i + (1 << (j - 1))][j - 1]);
}
}
for (int i = 1; i <= n; ++i) {
L[i] = R[i] = i;
while (true) {
bool has_expand = 0;
if (R[i] < n) {
for (int j = LG; j >= 0; --j) {
if (R[i] + (1 << j) <= n and bl[R[i] + 1][j] >= L[i]) {
has_expand = 1;
R[i] += (1 << j);
}
}
}
if (L[i] > 1) {
for (int j = LG; j >= 0; --j) {
if (L[i] - (1 << j) > 0 and br[L[i] - (1 << j)][j] <= R[i]) {
has_expand = 1;
auto t = get(L[i] - (1 << j), L[i] - 1);
L[i] = min(L[i], t.first);
R[i] = max(R[i], t.second);
}
}
}
if (!has_expand) {
break;
}
}
upd(i);
// debug(i, L[i], R[i]);
}
cin >> q;
while (q--) {
int u, v; cin >> u >> v;
cout << (L[u] <= v and v <= R[u] ? "YES\n" : "NO\n");
}
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
solve();
cerr << "\nTime: " << clock() * 1000 / CLOCKS_PER_SEC << endl;
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... |