Submission #250370

#TimeUsernameProblemLanguageResultExecution timeMemory
250370tutisFile Paths (BOI15_fil)C++17
33 / 100
1114 ms186872 KiB
/*input 2 4 22 2 0 1 1 5 2 13 2 10 1 4 0 7 */ #pragma GCC optimize ("O3") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; using namespace std; typedef long long ll; typedef long double ld; vector<int>dal[1000001]; int main() { ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0), cerr.tie(0); for (int i = 1; i <= 1000; i++) for (int j = i * i; j <= 1000000; j += i) dal[j].push_back(i); int n, m, k, s; cin >> n >> m >> k >> s; s++; int p[n + 1], d[n + 1], l[n + 1]; p[0] = -1; d[0] = 1; cc_hash_table<int, bool>D; D.insert({1, true}); for (int i = 1; i <= n; i++) { cin >> p[i] >> l[i]; d[i] = d[p[i]] + 1 + l[i]; D[d[i]] = true; } cc_hash_table<int, bool>cikl[n + 1]; for (int i = 0; i <= n; i++) { for (int j = i; j != -1; j = p[j]) { cikl[j][d[i] - d[j] + s] = true; } } function<bool(int, int)>ok = [&](int v, int ilg) { if (d[v] == ilg) return true; if (ilg <= 0) return false; if (v != 0 && ok(p[v], ilg - 1 - l[v])) return true; if (D.find(ilg - s) != D.end()) return true; if (ilg <= d[v] + s) return false; ilg -= d[v]; for (int c : dal[ilg]) { if (cikl[v].find(c) != cikl[v].end()) return true; if (cikl[v].find(ilg / c) != cikl[v].end()) return true; } return false; }; while (m--) { int p, l; cin >> p >> l; if (ok(p, k - l)) cout << "YES\n"; else cout << "NO\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...