#include <bits/stdc++.h>
using namespace std;
#define ll int64_t
#define ull unsigned long long
#define vi vector<int>
#define vll vector<int64_t>
#define vpi vector<pair<int, int>>
#define iter const auto&
#define all(v) (v).begin(), (v).end()
void Solve() {
int n; cin >> n;
vi door_keys(n - 1);
for (int i = 0; i < n - 1; i++) {
cin >> door_keys[i];
}
vector<vi> sector_keys(n);
vi key_count(n);
for (int i = 0; i < n; i++) {
cin >> key_count[i];
sector_keys[i].resize(key_count[i]);
for (int j = 0; j < key_count[i]; j++) {
cin >> sector_keys[i][j];
}
}
vi last_occurrence(n + 1, 0);
vi left_boundary(n + 1);
for (int i = 1; i <= n - 1; i++) {
for (iter key : sector_keys[i - 1]) {
last_occurrence[key] = i;
}
left_boundary[i] = last_occurrence[door_keys[i - 1]];
}
fill(all(last_occurrence), n + 1);
vi right_boundary(n + 1);
for (int i = n; i >= 2; i--) {
for (iter key : sector_keys[i - 1]) {
last_occurrence[key] = i;
}
right_boundary[i - 1] = last_occurrence[door_keys[i - 2]];
}
vi left_reach(n + 1), right_reach(n + 1);
for (int i = 1; i <= n; i++) {
left_reach[i] = right_reach[i] = i;
while (true) {
bool changed = false;
if (left_reach[i] > 1 && right_boundary[left_reach[i] - 1] <= right_reach[i]) {
right_reach[i] = max(right_reach[i], right_reach[left_reach[i] - 1]);
left_reach[i] = min(left_reach[i], left_reach[left_reach[i] - 1]);
changed = true;
}
if (right_reach[i] < n && left_reach[i] <= left_boundary[right_reach[i]]) {
right_reach[i]++;
changed = true;
}
if (!changed) break;
}
}
int q; cin >> q;
while (q--) {
int start, target;
cin >> start >> target;
if (left_reach[start] <= target && target <= right_reach[start]) {
cout << "YES\n";
} else {
cout << "NO\n";
}
}
}
int main() {
cin.tie(0)->sync_with_stdio(0);
Solve();
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... |