제출 #1211567

#제출 시각아이디문제언어결과실행 시간메모리
1211567i_love_springBall Machine (BOI13_ballmachine)C++20
100 / 100
282 ms27384 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ar array const int N = 1e5+5,LGN = 18; int n,r,q,p[N],mn[N],ord[N],have[N],lift[N][LGN]; set<ar<int,2>> order; vector<int>adj[N]; void dfs(int u,int p) { if(adj[u].empty()) mn[u] = u; for (int v : adj[u]) { if (v == p) continue; dfs(v,u); mn[u] = min(mn[u],mn[v]); } } void dfs2(int u,int p) { for (int v : adj[u]) { if (v == p) continue; dfs2(v,u); } ord[u] = (int)order.size() + 1; order.insert({ord[u],u}); } void build(){ for (int i = 0; i <= n;i++) { lift[i][0] = p[i]; } for (int lg = 1; lg < LGN;lg++) { for (int i = 0; i <= n;i++) { lift[i][lg] = lift[lift[i][lg - 1]][lg - 1]; } } } int get_kth(int u, int k) { int ans = u; for (int i = LGN - 1; i >= 0;i--) { if (k & (1 << i)) { ans = lift[ans][i]; } } return ans; } bool check(int u,int x) { return have[get_kth(u,x)]; } void solve() { cin >> n >> q; for (int i = 0; i < n;i++) mn[i] = i, have[i] = 0; for (int i = 0; i < n;i++) { cin >> p[i],--p[i]; if (p[i] == -1) { r = i; p[i] = n; p[n] = n; have[n] = 0; continue; } adj[p[i]].push_back(i); } dfs(r,r); for (int i = 0; i < n;i++) { sort(adj[i].begin(),adj[i].end(),[&](int x,int y) { return mn[x] < mn[y]; }); } dfs2(r,r); build(); while(q--) { int qt,k; cin >> qt >> k; if (qt == 1) { for (int i= 0; i < k - 1;i++) { have[(*order.begin())[1]] = 1; order.erase(order.begin()); } have[(*order.begin())[1]] = 1; cout << (*order.begin())[1] + 1 << "\n"; order.erase(order.begin()); }else { --k; int L = 0, R = n, ans = 0; while (L <= R) { int M = (L + R) / 2; if (check(k,M)) L = M + 1,ans = M; else R = M - 1; } int pr = get_kth(k,ans); order.insert({ord[pr],pr}); have[pr] = 0; cout << ans << "\n"; } } } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int t = 1; // cin >> t; while (t--) { solve(); cout << "\n"; } 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...