Submission #1173129

#TimeUsernameProblemLanguageResultExecution timeMemory
1173129ThommyDBFile Paths (BOI15_fil)C++20
100 / 100
111 ms9136 KiB
#include <bits/stdc++.h>

using namespace std;

int n,m,k,s;
vector<int> cyc, l, D, path;
vector<bool> hasl;
vector<vector<int>> chi;
vector<pair<int, bool>> ans;
vector<vector<pair<int, int>>> file;

void dfill(int a){
	D.clear();
	for(int i = 1; i*i <= a; i++) if(a%i==0){
		D.push_back(i);
		D.push_back(a/i);
	}
}

void update(int u, int Ld, int w){
    cyc[l[u]-Ld+s] += w;
    for(int v = 0; v < chi[u].size(); v++){
        update(chi[u][v],Ld,w);
    }
}

void solve(int u){
	path.push_back(u);
	update(u,l[u],1);
    for(int z = 0; z < file[u].size(); z++){
        dfill(k - l[u] - file[u][z].first);
        bool anss = false;
        for(int d = 0; d < D.size(); d++){
            if(cyc[D[d]] > 0) anss = true;
        }
        for(int p = 0; p < path.size(); p++){
            if(k - (l[u]-l[path[p]]+s+file[u][z].first) >= 0 && hasl[k - (l[u]-l[path[p]]+s+file[u][z].first)]) anss = true;
        }
        if(l[u]+file[u][z].first == k) anss = true;
		ans.push_back({file[u][z].second,anss});
    }
    for(int v = 0; v < chi[u].size(); v++){
        solve(chi[u][v]);
    }
	path.pop_back();
	update(u,l[u],-1);
}

int main () {
	cin >> n >> m >> k >> s;
    chi.resize(n+1); file.resize(n+1); cyc.resize(2000001); l.resize(n+1); hasl.resize(1000001);
	s++;
	k = k;
	l[0] = 1;
	hasl[1] = true;
    for(int i = 1; i <= n; i++){
        int a,b;
		cin >> a >> b;
		l[i] = b+1+l[a];
		hasl[l[i]] = true;
		chi[a].push_back(i);
    }

    for(int i = 0; i < m; i++){
        int a,b;
		cin >> a >> b;
		file[a].push_back({b,i});
    }
	solve(0);
	sort(ans.begin(), ans.end());
    for(auto u : ans){
        cout << (u.second?"YES\n":"NO\n");
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...