#include <bits/stdc++.h>
#define int long long
#define sz(a) (int)a.size()
#define all(a) a.begin(),a.end()
#define rall(a) a.rbegin(),a.rend()
using namespace std;
vector<vector<int>> child;
vector<int> depth;
vector<int> a;
vector<int> f;
vector<int> parent;
vector<int> file;
vector<int> dv;
vector<vector<int>> divs;
vector<pair<int,int>> it;
int n,m,k,s;
int in=0;
int c=1;
void prep(int x, int d){
d+=a[x];
depth[x]=d;
if(x>=n-m) { file.push_back(x); in++; }
else it[x].first=in;
for (auto u : child[x]) prep(u,d);
if(x<n-m) it[x].second=in;
}
void findSUM(int x, int d){
if(x>=n-m) return;
if(d>k) return;
dv[d]=c;
if(d+a[x]<=k) dv[d+a[x]]=c;
for (auto u : child[x]) findSUM(u,d+a[x]);
}
void dfs(int x){
if(x>=n-m) return;
for (auto u : child[x]) dfs(u);
c++;
findSUM(x,s);
for (int i = it[x].first; i <= it[x].second; i++)
{
if(f[file[i]]) continue;
for (auto u : divs[file[i]]) {
if(dv[u]==c) { f[file[i]]=true; break; }
}
}
}
signed main() {
cin >> n >> m >> k >> s;
n+=m+1;
depth.resize(n);
dv.resize(k+1,0);
divs.resize(n);
child.resize(n);
f.resize(n);
it.resize(n);
f.resize(n);
a.resize(n);
parent.resize(n);
s++;
for (int i = 1; i < n; i++) {
int p;
cin >> p>> a[i]; a[i]++;
child[p].push_back(i);
parent[i]=p;
}
a[0]=0;
parent[0]=-1;
prep(0,0);
for (int i = n-m; i < n; i++)
{
int x=k-depth[i];
if(x<=0) continue;
for (int j = 1; j <= sqrt(x); j++)
{
if(x%j==0){
divs[i].push_back(j);
if(x/j!=j) divs[i].push_back(x/j);
}
}
}
dfs(0);
c++;
for (int i = 0; i < n-m; i++)
{
if(depth[i]+s>k) continue;
dv[depth[i]+s]=c;
}
for (int i = n-m; i < n; i++){
int u=parent[i];
if(depth[i]==k) f[i]=true;
while(u>-1){
int x=depth[i]-depth[u];
int v=k-x;
if(v>=0&&dv[v]==c) f[i]=true;
u=parent[u];
}
}
for (int i = n-m; i < n; i++)
{
if(f[i]) cout << "YES\n";
else cout << "NO\n";
}
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... |