#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... |