Submission #83244

#TimeUsernameProblemLanguageResultExecution timeMemory
83244teomrnBall Machine (BOI13_ballmachine)C++14
42.88 / 100
985 ms35452 KiB
#include <bits/stdc++.h> using namespace std; const int NMAX = 100010; const int LGMAX = 18; vector <int> adia[NMAX + 10]; int nr_fii_activi[NMAX + 10]; bool taken[NMAX + 10]; int tata[NMAX + 10]; namespace RMQ { int h[NMAX + 10]; int stramos[LGMAX + 1][NMAX + 10]; int vmin[NMAX + 10]; void dfs(int nod, int tata) { h[nod] = 1 + h[tata]; vmin[nod] = nod; stramos[0][nod] = tata; for (int i = 1; i <= LGMAX; i++) stramos[i][nod] = stramos[i - 1][stramos[i - 1][nod]]; for (auto i : adia[nod]) { dfs(i, nod); vmin[nod] = min(vmin[nod], vmin[i]); } } bool mai_mic(int a, int b) { int inv = 0; if (h[a] < h[b]) swap(a, b), inv = 1; for (int i = LGMAX; i >= 0; i--) if (h[a] - (1 << i) >= h[b]) a = stramos[i][a]; for (int i = LGMAX; i >= 0; i--) if (stramos[i][a] != stramos[i][b]) a = stramos[i][a], b = stramos[i][b]; return inv ^ (vmin[a] < vmin[b]); } } struct Node { Node(int x) : nod(x) { } int nod; bool operator< (const Node & n) const { return RMQ::mai_mic(n.nod, nod); } }; priority_queue <Node> free_nodes; void add(int where) { taken[where] = 1; nr_fii_activi[tata[where]]--; if (nr_fii_activi[tata[where]] == 0 && tata[where]) free_nodes.push(tata[where]); } int rem(int where) { assert(taken[where]); int ans = 0; for (int i = LGMAX; i >= 0; i--) if (taken[RMQ::stramos[i][where]]) ans += (1 << i), where = RMQ::stramos[i][where]; taken[where] = 0; nr_fii_activi[tata[where]]++; free_nodes.push(where); return ans; } int main() { int n, m; ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m; int root; for (int i = 1; i <= n; i++) { cin >> tata[i]; if (tata[i] == 0) root = i; adia[tata[i]].push_back(i); nr_fii_activi[tata[i]]++; } for (int i = 1; i <= n; i++) if (nr_fii_activi[i] == 0) free_nodes.push(i); RMQ::dfs(root, 0); while (m--) { int type, x; cin >> type >> x; if (type == 1) { int last; while (x--) { assert(!free_nodes.empty()); int q = free_nodes.top().nod; free_nodes.pop(); while (nr_fii_activi[q] || taken[q]) { assert(!free_nodes.empty()); q = free_nodes.top().nod; free_nodes.pop(); } last = q; add(q); } cout << last << '\n'; } else cout << rem(x) << '\n'; } return 0; }

Compilation message (stderr)

ballmachine.cpp: In function 'int main()':
ballmachine.cpp:115:33: warning: 'last' may be used uninitialized in this function [-Wmaybe-uninitialized]
                 cout << last << '\n';
                                 ^~~~
ballmachine.cpp:95:17: warning: 'root' may be used uninitialized in this function [-Wmaybe-uninitialized]
         RMQ::dfs(root, 0);
         ~~~~~~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...