#include <bits/stdc++.h>
using namespace std;
struct seg {
	int n;
	vector<int> val;
	seg(int _n): n(_n), val(2*_n,-1e9) {}
	void up(int l, int r, int v) {
		for(l+=n,r+=n+1;l<r;l>>=1,r>>=1) {
			if(l&1) {
				val[l] = max(val[l], v);
				l++;
			}
			if(r&1) {
				r--;
				val[r] = max(val[r], v);
			}
		}
	}
	int qry(int x) {
		int ans = -1e9;
		for(x+=n;x;x>>=1)
			ans = max(ans, val[x]);
		return ans;
	}
};
int main() {
	int n;
	cin >> n;
	int c[n-1];
	for(int i=0;i<n-1;i++) {
		cin >> c[i]; 
		c[i]--;
	}
	set<int> occ[n];
	for(int i=0;i<n;i++) {
		int b;
		cin >> b;
		for(int a;b--;) {
			cin >> a;
			occ[a-1].insert(i);
		}
	}
	// in any "locked" range,
	// l >= f[r]
	// r <= g[l]
	int f[n], g[n];
	for(int i=0;i<n;i++) {
		if(i==0)
			g[i] = n-1;
		else {
			auto it = lower_bound(occ[c[i-1]].begin(),occ[c[i-1]].end(),i);
			if(it==occ[c[i-1]].end())
				g[i] = n-1;
			else
				g[i] = (*it) - 1;
		}
		if(i==n-1)
			f[i] = 0;
		else {
			auto it = upper_bound(occ[c[i]].begin(),occ[c[i]].end(),i);
			if(it == occ[c[i]].begin())
				f[i] = 0;
			else
				f[i] = (*--it) + 1;
		}
	}
	vector<int> ginv[n], finv[n];
	for(int i=0;i<n;i++) {
		finv[f[i]].push_back(i);
		ginv[g[i]].push_back(i);
	}
	seg l(n), r(n);
	set<int> val;
	for(int lft=n;lft--;) {
		val.insert(lft);
		if(lft != n - 1)
			for(auto rgt: finv[lft + 1])
				if(val.find(rgt) != val.end())
					val.erase(rgt);
		auto it = upper_bound(val.begin(),val.end(),g[lft]);
		if(it != val.begin())
			l.up(lft, *--it, lft);
	}
	val.clear();
	for(int rgt=0;rgt<n;rgt++) {
		val.insert(rgt);
		if(rgt != 0)
			for(auto lft: ginv[rgt - 1])
				if(val.find(lft) != val.end())
					val.erase(lft);
		auto it = lower_bound(val.begin(),val.end(),f[rgt]);
		if(it != val.end())
			r.up(*it, rgt, -rgt);
	}
	int q;
	cin >> q;
	while(q--) {
		int x, y;
		cin >> x >> y;
		x--; y--;
		if(l.qry(x) <= y && y <= -r.qry(x))
			cout << "YES\n";
		else
			cout << "NO\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... |