제출 #1124107

#제출 시각아이디문제언어결과실행 시간메모리
1124107adaawfBall Machine (BOI13_ballmachine)C++20
60.29 / 100
135 ms33456 KiB
#include <iostream> #include <set> #include <vector> using namespace std; set<pair<int, int>> s[100005]; vector<int> g[100005]; int l[100005][18], da[100005], d[100005], f[100005], h; void dfs(int x) { d[x] = x; for (int w : g[x]) { dfs(w); d[x] = min(d[x], d[w]); } } void dfs2(int x) { f[x] = x; for (int w : g[x]) s[x].insert({d[w], w}); for (auto w : s[x]) { dfs2(w.second); if (w.first == (*s[x].begin()).first) f[x] = f[w.second]; } } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, q; cin >> n >> q; for (int i = 1; i <= n; i++) { int x; cin >> x; l[i][0] = x; g[x].push_back(i); } dfs(0); dfs2(0); h = f[0]; for (int i = 1; i <= 17; i++) { for (int j = 1; j <= n; j++) { l[j][i] = l[l[j][i - 1]][i - 1]; } } for (int jj = 0; jj < q; jj++) { int w, x; cin >> w >> x; if (w == 1) { int res = 0; for (int i = 1; i <= x; i++) { res = h; da[h] = 1; s[l[h][0]].erase({d[h], h}); if (!s[l[h][0]].empty()) { int k = (*s[l[h][0]].begin()).second; h = f[k]; } else h = l[h][0]; } cout << res << '\n'; } else { int res = 0; for (int i = 17; i >= 0; i--) { if (da[l[x][i]] == 1) { x = l[x][i]; res += (1 << i); } } s[l[x][0]].insert({d[x], x}); h = x; da[h] = 0; cout << res << '\n'; } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...