Submission #1211567

#TimeUsernameProblemLanguageResultExecution timeMemory
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...