#include <bits/stdc++.h>
using namespace std;
int n;
int cor[500005];
vector<int> keys[500005];
pair<int,int> ans[500005];
vector<pair<int,int> > lw,rw;
void dnc(int l, int r, vector<pair<int,int> > lft, vector<pair<int,int> > rgt){ //only consider walls blocking [l,r]
	if(l>r) return;
	int m=(l+r)/2;
	vector<pair<int,int> > monol,monor;
	for(int i=(int)lft.size()-1; i>=0; i--){
		if(lft[i].first>m) continue;
		if(!monol.empty()&&monol.back().second>=lft[i].second) continue;
		monol.push_back(lft[i]);
	}
	for(int i=0; i<(int)rgt.size(); i++){
		if(rgt[i].second<m) continue;
		if(!monor.empty()&&monor.back().first<=rgt[i].first) continue;
		monor.push_back(rgt[i]);
	}
	int c1=0,c2=0;
	for(int i=m; i>=l; i--){
		while(true){
			if(c1>=(int)monol.size()||c2>=(int)monor.size()) break;
			if(monol[c1].first<=i&&monor[c2].first<=monol[c1].first&&monor[c2].second<=monol[c1].second) break;
			if(monol[c1].first>i) c1++;
			else if(monor[c2].first>monol[c1].first) c2++;
			else c1++;
		}
		if(c1<(int)monol.size()&&c2<(int)monor.size()){
			ans[i].first=max(ans[i].first,monol[c1].first);
			ans[i].second=min(ans[i].second,monor[c2].second);
		}
	}
	c1=0,c2=0;
	for(int i=m; i<=r; i++){
		while(true){
			if(c1>=(int)monol.size()||c2>=(int)monor.size()) break;
			if(monor[c2].second>=i&&monol[c1].second>=monor[c2].second&&monol[c1].first>=monor[c2].first) break;
			if(monor[c2].second<i) c2++;
			else if(monol[c1].second<monor[c2].second) c1++;
			else c2++;
		}
		if(c1<(int)monol.size()&&c2<(int)monor.size()){
			ans[i].first=max(ans[i].first,monol[c1].first);
			ans[i].second=min(ans[i].second,monor[c2].second);
		}
	}
	if(l!=r){
		vector<pair<int,int> > tmpl,tmpr;
		for(auto i:lft) if(i.first<m) tmpl.push_back(i);
		for(auto i:rgt) if(i.second<m) tmpr.push_back(i);
		dnc(l,m-1,tmpl,tmpr);
		tmpl.clear(); tmpr.clear();
		for(auto i:lft) if(i.first>m) tmpl.push_back(i);
		for(auto i:rgt) if(i.second>m) tmpr.push_back(i);
		dnc(m+1,r,tmpl,tmpr);
	}
}
int32_t main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n;
	for(int i=1; i<n; i++) cin >> cor[i];
	for(int i=1; i<=n; i++){
		int m;
		cin >> m;
		for(int j=0; j<m; j++){
			int x;
			cin >> x;
			keys[i].push_back(x);
		}
	}
	int prev[n+5];
	memset(prev,0,sizeof(prev));
	for(int i=1; i<n; i++){
		for(int j:keys[i]) prev[j]=i;
		if(prev[cor[i]]!=i) rw.push_back({prev[cor[i]]+1,i});
	}
	rw.push_back({0,n});
	for(int i=0; i<=n; i++) prev[i]=n+1;
	for(int i=n; i>1; i--){
		for(int j:keys[i]) prev[j]=i;
		if(prev[cor[i-1]]!=i) lw.push_back({i,prev[cor[i-1]]-1});
	}
	lw.push_back({1,n+1});
	for(int i=1; i<=n; i++) ans[i]={1,n};
	dnc(1,n,lw,rw);
	//for(int i=1; i<=n; i++) cout << ans[i].first << ' ' << ans[i].second << '\n';
	int q;
	cin >> q;
	while(q--){
		int a,b;
		cin >> a >> b;
		if(b>=ans[a].first&&b<=ans[a].second) 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... |