제출 #1243269

#제출 시각아이디문제언어결과실행 시간메모리
1243269julia_08Ball Machine (BOI13_ballmachine)C++20
100 / 100
194 ms31504 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e5 + 10;

int pre[MAXN], pos[MAXN];

int sub[MAXN], bit[MAXN];

int dp[20][MAXN];

vector<int> adj[MAXN];

set<pair<pair<int, int>, int>> empty_nodes;

int n;

bool cmp(int a, int b){
  return sub[a] < sub[b];
}

void bit_add(int pos, int x){
  for(int i=pos; i<=(n + 1); i+=(i&-i)){
    bit[i] += x;
  }
}

int bit_query(int pos){

  int sum = 0;

  for(int i=pos; i>0; i-=(i&-i)){
    sum += bit[i];
  } 

  return sum;

}

void dfs_0(int v){

  sub[v] = v;

  for(auto u : adj[v]){
    dfs_0(u);
    sub[v] = min(sub[v], sub[u]);
  }

}

int t = 0;

void dfs_1(int v){

  pre[v] = ++t;

  bit_add(pre[v], 1);

  for(auto u : adj[v]){
    dp[0][u] = v;
    dfs_1(u);
  }

  pos[v] = t;
  empty_nodes.insert({{pos[v], -pre[v]}, v});

}

pair<int, int> jump(int v){

  int d = 0;

  for(int k=19; k>=0; k--){
    if(bit_query(pos[dp[k][v]]) - bit_query(pre[dp[k][v]] - 1) == 0){
      d += (1 << k);
      v = dp[k][v];
    }
  }

  return {v, d};

}

int main(){
  cin.tie(0)->sync_with_stdio(0); 

  int q; cin >> n >> q;

  for(int i=1; i<=n; i++){
    int p; cin >> p;
    adj[p].push_back(i);
  }

  dfs_0(0);

  for(int i=1; i<=n; i++) sort(adj[i].begin(), adj[i].end(), cmp);

  dfs_1(0);

  for(int k=1; k<20; k++){
    for(int i=1; i<=n; i++){
      dp[k][i] = dp[k - 1][dp[k - 1][i]];
    }
  }

  while(q--){

    int type; cin >> type;

    if(type == 1){

      int k; cin >> k;

      int last = -1;

      while(k--){

        last = empty_nodes.begin()->second;

        bit_add(pre[last], -1);
        empty_nodes.erase(empty_nodes.begin());

      }

      cout << last << "\n";

    } else{

      int x; cin >> x;

      auto [v, d] = jump(x);
 
      empty_nodes.insert({{pos[v], -pre[v]}, v});
      bit_add(pre[v], 1);

      cout << d << "\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...