// one expects wise words here, but what can one do when they cannot find words to express their thoughts?
// just staring at the messy code below, arent you? well, im supposed to improve, not jibber jabber here.
// perhaps one does not have a choice when he does not enjoy anything, so he just yaps to himself in vsc like a loser.
// ome47
#include "bits/stdc++.h"
using namespace std;
#define intt long long
const intt mxN = 2e5 + 5;
const intt LG = 20;
const intt inf = 1e18;
vector<vector<intt>> graph, up;
vector<intt> par(mxN), in(mxN), out(mxN), isfull(mxN), depth(mxN);
set<intt> avil;
intt n, q, timer, root;
void dfs(intt node, intt parent) {
if(graph[node].size() == 1 && node != root) {
avil.insert(node);
}
in[node] = timer++;
up[0][node] = parent;
for(intt i = 1; i <= LG; i++) {
up[i][node] = up[i-1][up[i-1][node]];
}
for(auto u : graph[node]) {
if(u != parent) {
depth[u] = depth[node] + 1;
dfs(u, node);
}
}
out[node] = timer++;
}
intt bl(intt node, intt k) {
for(intt i = LG - 1; i >= 0; i--) {
if((1 << i) & k) {
node = up[i][node];
}
}
return node;
}
void _() {
cin >> n >> q;
graph.assign(n + 1, vector<intt> {});
up.assign(LG + 1, vector<intt>(n + 1, 0ll));
in.assign(n + 1, 0ll); out.assign(n + 1, 0ll);
for(intt i = 1; i <= n; i++) {
intt node; cin >> node;
if(node == 0) {
root = i;
par[root] = 0;
} else {
graph[node].push_back(i);
graph[i].push_back(node);
par[i] = node;
}
}
dfs(root, par[root]);
while(q--) {
intt type, x, ans = 0;
cin >> type >> x;
if(type == 1) {
for(intt i = 0; i < x; i++) {
if(avil.empty()) break;
intt leaf = *avil.begin();
isfull[leaf] = 1;
avil.erase(avil.begin());
ans = leaf;
if(leaf != root)
avil.insert(par[leaf]);
}
} else {
if(isfull[root]) {
isfull[root] = 0;
avil.insert(root);
cout << depth[x] << endl;
continue;
}
intt l = 1, r = depth[x], anc = x;
while(l <= r) {
intt mid = (l + r) / 2;
intt cand = bl(x, mid);
if(isfull[cand]) {
anc = cand;
l = mid + 1;
} else {
r = mid - 1;
}
}
if(!avil.empty() && avil.find(par[anc]) != avil.end()) {
avil.erase(par[anc]);
}
avil.insert(anc);
isfull[anc] = 0;
ans = depth[x] - depth[anc];
}
cout << ans << endl;
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
intt t = 1;
// cin >> t;
while(t--){
_();
}
}
// ⠀⠀⠀⠀⠀⠀⠀⢀⣤⣦⣶⣤⠀⠀⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⣤⢀⣀⡀⣠⣄⣠⣶⣿⣿⣿⣿⣿⣿⣿⣷⣾⡦⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⠻⡳⢛⠛⠒⠚⢛⣿⣿⠟⠋⠉⠛⠛⢿⣿⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀
// ⢛⡛⢿⣿⠟⠻⠛⣿⣇⣶⣖⣤⣀⣄⡰⣹⣿⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀
// ⢿⠿⠿⠿⠿⠿⠿⢭⣐⠠⢼⣬⠽⢈⢁⡿⠛⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ⣛⣱⣤⣤⣤⣀⣄⣄⣗⢌⠋⠉⢙⣴⣧⢤⣤⣤⣤⣦⡀⠀⠀⠀⠀⢺⡿
// ⣿⣿⣿⠟⠛⠋⠀⡬⠼⢠⠍⠂⠀⠨⡇⠀⡏⠉⠛⢿⣧⠀⠀⠀⠀⢸⣀
// ⣟⠄⠀⠀⠀⠀⠀⢡⠀⠀⠀⠀⠀⡠⠁⢀⠁⠀⠀⠀⠘⣗⢀⠄⢶⣼⣾
// ⠀⠀⠀⢠⣦⠇⠀⠀⠁⠒⠒⠒⠈⠀⠀⠀⣞⢶⡀⠀⠀⠹⣧⣠⡞⣸⣏
// ⠀⠀⢀⡞⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣦⡀⠀⠈⠫⣕⣻⡇
// ⠀⠀⣾⣧⠈⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠠⣿⣿⣿⣷⣦⡠⡤⠀⣿⡇
// ⠠⢿⣿⣿⠂⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⠀⠴⣿⣿⣿⣿⠟⠋⢀⣤⣿⣷
// ⣀⣀⣀⣙⣃⣠⣤⣔⣤⣢⣵⣒⣒⣢⣄⣤⣄⣛⣋⣉⣀⣀⣤⣿⣿⣿⣿
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |