Submission #126051

#TimeUsernameProblemLanguageResultExecution timeMemory
126051wasylBall Machine (BOI13_ballmachine)C++11
100 / 100
219 ms29816 KiB
#include <bits/stdc++.h> #ifndef DBG #define dbg(...) #else #define dbg(...) {cerr << "\033[1;96m"; __VA_ARGS__; cerr << "\033[0m";} #endif #define bgn(...) begin(__VA_ARGS__) #define rsz(...) resize(__VA_ARGS__) #define emp(...) emplace_back(__VA_ARGS__) #define psh(...) push_back(__VA_ARGS__) #define ddmp(...) dbg(dmp(__VA_ARGS__)) #define prt(...) print(cout, __VA_ARGS__) #define dprt(...) dbg(print(cerr, __VA_ARGS__)) #define dmp(...) print(cerr, #__VA_ARGS__, '=', __VA_ARGS__) #define all(...) bgn(__VA_ARGS__), end(__VA_ARGS__) #define siz(...) static_cast< int >((__VA_ARGS__).size()) using namespace std; using ll = long long; template< typename... t > using V = vector< t... >; template< typename... t > using outit = ostream_iterator< t... >; template< typename t > void print(ostream& os, const t& a) {os << a << '\n';} template< typename t, typename... v > void print(ostream& os, const t& a, v&&... b){os << a << ' '; print(os, b...);} constexpr int maxn = 1e5, logg = 20; int n, q, t; bool occ[maxn + 1]; int mi[maxn + 1]; int cnt[maxn + 1]; int sk[maxn + 1][logg]; int tb[maxn + 1], bt[maxn + 1]; set< pair< int, int > > S; V< int > gr[maxn + 1]; void dfs1(int v, int oj) { ddmp(v, oj); mi[v] = v; for (int s : gr[v]) if (s != oj) dfs1(s, v), mi[v] = min(mi[v], mi[s]); } void dfs2(int v, int oj) { dprt("dfs2"); ddmp(v, oj); sk[v][0] = oj; tb[v] = ++t; bt[t] = v; V< pair< int, int > > ilo; for (int s : gr[v]) if (s != oj) ilo.psh({mi[s], s}); sort(all(ilo)); for (auto& p : ilo) dfs2(p.second, v); } inline int zrzuc() { dprt("zrzuc"); assert(not S.empty()); int v = (*S.begin()).second; S.erase(S.begin()); occ[v] = true; ++cnt[sk[v][0]]; if (sk[v][0] != 0 and cnt[sk[v][0]] == gr[sk[v][0]].size()) S.insert({tb[sk[v][0]], sk[v][0]}); return v; } inline int usun(int v) { dprt("usun"); dprt(v); int sum = 0; for (int i = logg - 1; i >= 0; --i) if (occ[sk[v][i]]) { sum += (1 << i); v = sk[v][i]; } ddmp(v); occ[v] = false; if (sk[v][0] != 0 and cnt[sk[v][0]] == gr[sk[v][0]].size()) { assert(occ[sk[v][0]] == false); assert(S.find({tb[sk[v][0]], sk[v][0]}) != S.end()); S.erase(S.find({tb[sk[v][0]], sk[v][0]})); } --cnt[sk[v][0]]; S.insert({tb[v], v}); return sum; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> q; for (int i = 1; i <= n; ++i) { int v; cin >> v; gr[v].psh(i); } dfs1(0, 0); dfs2(0, 0); for (int i = 1; i < logg; ++i) for (int k = 1; k <= n; ++k) sk[k][i] = sk[sk[k][i - 1]][i - 1]; for (int i = 1; i <= n; ++i) if (gr[i].size() == cnt[i]) S.insert({tb[i], i}); for (int i = 0; i < q; ++i) { int t, v; cin >> t >> v; if (t == 1) while (v--) { if (v == 0) prt(zrzuc()); else zrzuc(); } if (t == 2) prt(usun(v)); } }

Compilation message (stderr)

ballmachine.cpp: In function 'int zrzuc()':
ballmachine.cpp:71:41: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if (sk[v][0] != 0 and cnt[sk[v][0]] == gr[sk[v][0]].size())
                           ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
ballmachine.cpp: In function 'int usun(int)':
ballmachine.cpp:92:41: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if (sk[v][0] != 0 and cnt[sk[v][0]] == gr[sk[v][0]].size())
                           ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
ballmachine.cpp: In function 'int main()':
ballmachine.cpp:127:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if (gr[i].size() == cnt[i])
             ~~~~~~~~~~~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...