제출 #116334

#제출 시각아이디문제언어결과실행 시간메모리
116334ZwariowanyMarcinBall Machine (BOI13_ballmachine)C++14
100 / 100
618 ms28336 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define pb push_back #define ld long double #define fi first #define se second #define ll long long #define ss(x) (int) x.size() #define mp make_pair #define FOR(i, n) for(int i = 1; n >= i; ++i) using namespace std; using namespace __gnu_pbds; const int nax = 1e5 + 5, pod = (1 << 19), mod = 998244353; const ll inf = 1e18; int n, q; int root; vector <int> v[nax]; int black[nax], lca[nax][17]; int dp[nax]; int pr[nax]; int fre = 0; void dfs(int node) { dp[node] = node; for(auto it: v[node]) { dfs(it); dp[node] = min(dp[node], dp[it]); lca[it][0] = node; } } void go(int node) { vector <pair<int, int>> e; for(auto it: v[node]) { e.pb(mp(dp[it], it)); } sort(e.begin(), e.end()); for(auto it: e) { go(it.se); } pr[node] = fre++; } set <pair<int, int>> s; int add() { pair<int, int> x = *s.begin(); black[x.se] = 1; s.erase(s.begin()); return x.se; } int main() { cin.tie(0); ios_base::sync_with_stdio(0); cin >> n >> q; for(int i = 1; i <= n; ++i) { int p; cin >> p; if(!p) root = i; else v[p].pb(i); } dfs(root); for(int j = 1; j <= 16; ++j) for(int i = 1; i <= n; ++i) lca[i][j] = lca[lca[i][j - 1]][j - 1]; go(root); for(int i = 1; i <= n; ++i) s.insert(mp(pr[i], i)); while(q--) { int type; int k; cin >> type >> k; if(type == 1) { int res = -1; while(k--) { res = add(); } cout << res << endl; } else { int w = k; int dis = 0; for(int i = 16; 0 <= i; --i) { int r = lca[w][i]; if(!r) continue; if(black[r]) { w = r; dis += (1 << i); } } black[w] = 0; s.insert(mp(pr[w], w)); cout << dis << endl; } } return 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...