Submission #231724

#TimeUsernameProblemLanguageResultExecution timeMemory
231724borderBall Machine (BOI13_ballmachine)C++14
16.11 / 100
210 ms131076 KiB
#include <bits/stdc++.h> // #include <ext/pb_ds/assoc_container.hpp> // Common file // #include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update using namespace std; // using namespace __gnu_pbds; #define debug(s) cerr << #s << " = " << s << '\n' #define all(v) (v).begin(), (v).end() #define mem(a,val) memset(a, val, sizeof a) #define ff first #define ss second typedef long long ll; // typedef tree<pair<int, int>,null_type,less<pair<int, int>>,rb_tree_tag,tree_order_statistics_node_update> ordered_set; const int N = 100010; int n, q, ptr, root; int T[N], P[N][20], col[N], val[N]; vector<int> adj[N]; set<pair<int, int>> s; struct dat { int val, node; bool operator<(const dat &a) const { return val > a.val; } }; int dfs0(int from, int u) { priority_queue<dat> pq; for (auto v: adj[u]) { if (v == from) continue; pq.push({dfs0(v, u), v}); } adj[u].clear(); int ret = u; while (!pq.empty()) { adj[u].push_back(pq.top().node); ret = min(ret, pq.top().val); pq.pop(); } } void dfs(int from, int u) { T[u] = from; for (auto v: adj[u]){ if (v == from) continue; dfs(u, v); } val[u] = ptr; s.insert({ptr++, u}); } void init() { int i, j; for (i = 1; i <= n; i++) for (j = 0; j < 18; j++) P[i][j] = -1; for (i = 1; i <= n; i++) P[i][0] = T[i]; for (j = 1; j < 18; j++) for (i = 1; i <= n; i++) if (P[i][j - 1] != -1) P[i][j] = P[P[i][j - 1]][j - 1]; } int main() { scanf("%d %d", &n, &q); for (int i = 1; i <= n; ++i) { int x; scanf("%d", &x); if (x == 0) root = i; adj[x].push_back(i); } dfs0(-1, root); dfs(-1, root); init(); while (q--) { int ty, v; scanf("%d %d", &ty, &v); if (ty == 1) { int ret; while (v--) { int node = (*s.begin()).ss; col[node] = 1; ret = node; s.erase({val[node], node}); } printf("%d\n", ret); } else { int ret = 0; for (int i = 16; i >= 0; --i) { if (col[P[v][i]]) { ret += (1 << i); v = P[v][i]; } } col[v] = 0; s.insert({val[v], v}); printf("%d\n", ret); } } }

Compilation message (stderr)

ballmachine.cpp: In function 'int dfs0(int, int)':
ballmachine.cpp:45:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
ballmachine.cpp: In function 'int main()':
ballmachine.cpp:72:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &n, &q);
   ~~~~~^~~~~~~~~~~~~~~~~
ballmachine.cpp:75:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &x);
     ~~~~~^~~~~~~~~~
ballmachine.cpp:84:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d", &ty, &v);
     ~~~~~^~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...