Submission #666275

#TimeUsernameProblemLanguageResultExecution timeMemory
666275vuavisaoBall Machine (BOI13_ballmachine)C++14
100 / 100
186 ms24312 KiB
#include<bits/stdc++.h> #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #define ll long long using namespace std; template<typename Lhs, typename Rhs> inline void Max_self(Lhs &a, Rhs b) { a = (a > b ? a : b); } template<typename Lhs, typename Rhs> inline void Min_self(Lhs &a, Rhs b) { a = (a < b ? a : b); } const int N = 1e5 + 10; void dfs_more_and_more(int u); void dfs_calc(int u); void pre_calc(); int first_parent(int u); int n, q; vector<int> g[N]; int root; int Lg, dist[N], parent[20][N]; bool have[N]; priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; int cnt, in[N]; int dp[N]; void dfs_more_and_more(int u) { dp[u] = u; for(auto v : g[u]) { dist[v] = dist[u] + 1; parent[0][v] = u; dfs_more_and_more(v); Min_self(dp[u], dp[v]); } } void dfs_calc(int u) { sort(g[u].begin(), g[u].end(), [&] (int lhs, int rhs) { if(dp[lhs] != dp[rhs]) return dp[lhs] < dp[rhs]; return lhs < rhs; }); for(auto v : g[u]) dfs_calc(v); in[u] = ++ cnt; pq.push(make_pair(in[u], u)); } int first_parent(int u) { for(int i = Lg; i >= 0; -- i) if(have[parent[i][u]] & 1) u = parent[i][u]; return u; } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if (fopen("Ball.inp", "r")) { freopen("Ball.inp", "r", stdin); freopen("Ball.out", "w", stdout); } cin >> n >> q; for(int v = 1; v <= n; ++ v) { int u; cin >> u; if(u == 0) root = v; else g[u].push_back(v); // cout << u << ' ' << v << '\n'; } pre_calc(); while(q--) { int type; cin >> type; if(type == 1) { int k; cin >> k; while(k--) { auto psy = pq.top(); pq.pop(); have[psy.second] = true; if(k == 0) cout << psy.second; } } else { int u; cin >> u; int p = first_parent(u); have[p] = false; pq.push(make_pair(in[p], p)); // cout << u << ' ' << p << ' '; cout << dist[u] - dist[p]; } cout << '\n'; } return 0; } void pre_calc() { dfs_more_and_more(root); dfs_calc(root); Lg = __lg(n); for(int j = 1; j <= Lg; ++ j) for(int i = 1; i <= n; ++ i) parent[j][i] = parent[j - 1][parent[j - 1][i]]; } /// Code by vuavisao

Compilation message (stderr)

ballmachine.cpp: In function 'int32_t main()':
ballmachine.cpp:60:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   60 |         freopen("Ball.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
ballmachine.cpp:61:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   61 |         freopen("Ball.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...