/**         - dwuy -
      />    フ
      |  _  _|
      /`ミ _x ノ
     /      |
    /   ヽ   ?
 / ̄|   | | |
 | ( ̄ヽ__ヽ_)_)
 \二つ
**/
#include <bits/stdc++.h>
#define fastIO ios_base::sync_with_stdio(false); cin.tie(NULL)
#define file(a) freopen(a".inp","r",stdin); freopen(a".out", "w",stdout)
#define fi first
#define se second
#define endl "\n"
#define len(s) (int)((s).size())
#define MASK(k)(1LL<<(k))
#define TASK "test"
using namespace std;
typedef tuple<int, int, int> tpiii;
typedef pair<double, double> pdd;
typedef pair<int, int> pii;
typedef long long ll;
const long long OO = 1e18;
const int MOD = 1e9 + 7;
const int INF = 1e9;
const int MX = 500005;
struct SMT{
    int n;
    vector<pii> tree;
    SMT(int n = 0) : n(n), tree(n<<2|3, {INF, INF}) {}
    void build(int l, int r, int id, int *a){
        if(l == r){
            tree[id] = {a[l], l};
            return;
        }
        int mid = (l + r)>>1;
        build(l, mid, id<<1, a);
        build(mid+1, r, id<<1|1, a);
        tree[id] = min(tree[id<<1], tree[id<<1|1]);
    }
    void build(int *a){
        build(1, n, 1, a);
    }
    pii get(int l, int r, int id, const int &u, const int &v, const int &lim){
        if(l > v || r < u || tree[id].first > lim) return tree[0];
        if(l == r){
            pii p = tree[id];
            tree[id] = {INF, INF};
            return p;
        }
        int mid = (l + r)>>1;
        pii p = get(l, mid, id<<1, u, v, lim);
        return p.first != INF? p : get(mid + 1, r, id<<1|1, u, v, lim);
    }
    pii get(int l, int r, int lim){
        return get(1, n, 1, l, r, lim);
    }
};
int n, q;
int a[MX], s[MX], t[MX], vist[MX];
int fl[MX], fr[MX], ans[MX];
vector<int> b[MX];
namespace dwuy{
    vector<int> qr[MX];
    int trace[MX];
    void build1(){
        for(int i=1; i<=q; i++) if(s[i] < t[i]){
            qr[s[i]].push_back(i);
        }
    }
    void build2(){
        for(int i=0; i<MX; i++) qr[i].clear();
        reverse(fl + 1, fl + n + 1);
        reverse(fr + 1, fr + n + 1);
        for(int i=1; i<=n; i++){
            fl[i] = n - fl[i] + 1;
            fr[i] = n - fr[i] + 1;
            swap(fl[i], fr[i]);
        }
        fr[0] = n + 1;
        for(int i=1; i<=q; i++) if(s[i] > t[i]){
            s[i] = n - s[i] + 1;
            t[i] = n - t[i] + 1;
            qr[s[i]].push_back(i);
        }
    }
    void solve(){
        priority_queue<int, vector<int>, greater<int>> Q;
        SMT smt(n);
        smt.build(fl);
        for(int i=1; i<=n; i++){
            if(Q.size() && Q.top() <= i){
                int u = trace[Q.top()];
                Q.pop();
                if(fr[u] > i){
                    pii e = smt.get(i + 1, fr[u], u);
                    if(e.fi != INF){
                        trace[e.se] = u;
                        Q.push(e.se);
                    }
                }
            }
            pii e = smt.get(i + 1, min(n, fr[i - 1]), i - 1);
            if(e.fi != INF){
                trace[e.se] = i- 1;
                Q.push(e.se);
            }
        
            for(int j: qr[i]){
                if(!Q.size() || t[j] < Q.top()) ans[j] = 1;
            }
        }
    }
}
int32_t main(){
    fastIO;
    //file(TASK);
    cin >> n;
    for(int i=1; i<n; i++) cin >> a[i];
    for(int i=1; i<=n; i++){
        int d; cin >>  d;
        b[i].resize(d);
        for(int &x: b[i]) cin >> x;
    }
    cin >> q;
    for(int i=1; i<=q; i++){
        cin >> s[i] >> t[i];
    }
    memset(vist, 0, sizeof vist);
    for(int i=1; i<=n; i++){
        fl[i] = vist[a[i - 1]];
        for(int x: b[i]) vist[x] = i;
    }
    memset(vist, 0, sizeof vist);
    for(int i=n; i>=1; i--){
        fr[i] = vist[a[i]] == 0? n + 1 : vist[a[i]];
        for(int x: b[i]) vist[x] = i;
    }
    fr[0] = n + 1;
    dwuy::build1(); dwuy::solve();
    dwuy::build2(); dwuy::solve();
    for(int i=1; i<=q; i++) cout << (ans[i]? "YES" : "NO") << 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... |