Submission #231761

#TimeUsernameProblemLanguageResultExecution timeMemory
231761borderBall Machine (BOI13_ballmachine)C++14
100 / 100
233 ms28348 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], sub[N]; vector<int> adj[N]; set<pair<int, int>> s; bool cmp(int A, int B) { return sub[A] < sub[B]; } void dfs0(int from, int u) { sub[u] = u; for (auto v: adj[u]) { if (v == from) continue; dfs0(u, v); sub[u] = min(sub[u], sub[v]); } sort(all(adj[u]), cmp); } 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++) P[i][0] = T[i]; for (j = 1; j < 18; j++) for (i = 1; i <= n; i++) 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(0, root); dfs(0, 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 main()':
ballmachine.cpp:60: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:63:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &x);
     ~~~~~^~~~~~~~~~
ballmachine.cpp:72: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...