Submission #1120007

#TimeUsernameProblemLanguageResultExecution timeMemory
1120007Captain_GeorgiaBall Machine (BOI13_ballmachine)C++17
0 / 100
228 ms34020 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; int32_t main () { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int N, Q; cin >> N >> Q; vector<int> g[N]; int root = -1; for (int i = 0;i < N;i ++) { int p; cin >> p; -- p; if (p != -1) g[p].push_back(i); else root = i; } assert(root != -1); const int lg = 20; vector<vector<int>> up(lg, vector<int>(N, 0)); vector<int> tin(N, 0), tout(N, 0), submn(N), depth(N, 0); int _time = 0; function<void(int, int)> dfs_init = [&](int si, int pi) -> void { up[0][si] = pi; for (int i = 1;i < lg;i ++) { up[i][si] = up[i - 1][up[i - 1][si]]; } submn[si] = si; tin[si] = ++ _time; for (auto v : g[si]) if (v != pi) { depth[v] = depth[si] + 1; dfs_init (v, si); submn[si] = min(submn[si], submn[v]); } tout[si] = _time; }; dfs_init (root, root); vector<int> all; auto cmp = [&](int x, int y) -> bool { return submn[x] < submn[y]; }; function<void(int, int)> dfs = [&](int si, int pi) -> void { sort (g[si].begin(), g[si].end(), cmp); // cout << si << " "; // for (auto v : g[si]) if (v != pi) { // cout << v << " "; // } cout << "\n"; for (auto v : g[si]) if (v != pi) { dfs (v, si); } all.push_back(si); }; dfs (root, root); // for (auto v : all) cout << v << " "; // cout << "\n"; vector<int> val(N + 1); set<array<int, 2>> index; for (int i = 0;i < all.size();i ++) { val[all[i]] = i; index.insert({i, all[i]}); } auto is_ancestor = [&](int x, int y) -> bool { return (tin[x] <= tin[y] && tout[x] >= tout[y]); }; vector<int> used(N, 0); while (Q --) { int typ, x; cin >> typ >> x; if (typ == 1) { for (int i = 0;i < x;i ++) { assert (index.size() > 0); if (i == x - 1) { cout << depth[(*index.begin())[1]] + 1 << "\n"; } used[(*index.begin())[1]] = 1; index.erase(index.begin()); } } else { -- x; int lc = x; for (int bt = lg - 1;bt >= 0;bt --) if (used[up[bt][lc]] == 1) { lc = up[bt][lc]; } used[lc] = 0; index.insert({val[lc], lc}); cout << depth[x] - depth[lc] << "\n"; } } }

Compilation message (stderr)

ballmachine.cpp: In function 'int32_t main()':
ballmachine.cpp:67:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |     for (int i = 0;i < all.size();i ++) {
      |                    ~~^~~~~~~~~~~~
ballmachine.cpp:71:10: warning: variable 'is_ancestor' set but not used [-Wunused-but-set-variable]
   71 |     auto is_ancestor = [&](int x, int y) -> bool {
      |          ^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...