#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() {
ios_base::sync_with_stdio(0); cin.tie(0);
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);
}
}
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... |