This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int nx=5e5+5;
int n, lstl[nx], lstr[nx], l[nx], r[nx], x, y, qrs, lst[nx], c[nx];
vector<int> d[nx];
void solve(int vl, int vr)
{
if (vl==vr) return l[vl]=r[vl]=vl, void();
int md=(vl+vr)/2, cl=md, cr=md;
solve(vl, md);
solve(md+1, vr);
for (int i=md; i>=vl; i--)
{
if (r[i]==md)
{
cl=min(cl, l[i]);
while (1)
{
if (vl<cl&&lstr[cl]<=cr) cl--;
else if (cr<vr&&lstl[cr]>=cl) cr++;
else break;
}
l[i]=cl;
r[i]=cr;
}
}
cl=cr=md+1;
for (int i=md+1; i<=vr; i++)
{
if (l[i]==md+1)
{
cr=max(cr, r[i]);
while (1)
{
if (vl<cl&&lstr[cl]<=cr) cl--;
else if (cr<vr&&lstl[cr]>=cl) cr++;
else break;
}
l[i]=cl;
r[i]=cr;
}
}
}
int main()
{
cin.tie(NULL)->sync_with_stdio(false);
cin>>n;
for (int i=1; i<n; i++) cin>>c[i];
for (int i=1; i<=n; i++)
{
cin>>x;
for (int j=1; j<=x; j++) cin>>y, d[i].push_back(y);
}
for (int i=1; i<n; i++)
{
for (auto x:d[i]) lst[x]=i;
lstl[i]=lst[c[i]];
}
for (int i=1; i<=n; i++) lst[i]=n+1;
for (int i=n; i>1; i--)
{
for (auto x:d[i]) lst[x]=i;
lstr[i]=lst[c[i-1]];
}
solve(1, n);
cin>>qrs;
while (qrs--)
{
cin>>x>>y;
if (l[x]<=y&&y<=r[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... |