#include <bits/stdc++.h>
using namespace std;
struct Fenw {
int n; vector<int> BIT;
Fenw(int N = 0) : n(N), BIT(N, 0) {}
void update(int r, int delta) {for (; r < n; r |= r+1) BIT[r] += delta;}
void update(int l, int r, int delta) {update(l, delta); update(r+1, -delta);}
int query(int i) {int res = 0; for (; i >= 0; i &= i+1, i--) res += BIT[i]; return res;}
};
const int MAXLOG = 18;
int n, q, timer = 0;
vector<vector<int>> G, up;
vector<int> order, pos, min_subtree, tin, tout;
void dfs1(int u, int p) {
tin[u] = timer++;
up[u][0] = p;
for (int i = 1; i < MAXLOG; i++) {
up[u][i] = up[up[u][i-1]][i-1];
}
min_subtree[u] = u;
for (auto v : G[u]) {
dfs1(v, u); min_subtree[u] = min(min_subtree[u], min_subtree[v]);
}
tout[u] = timer++;
}
void dfs2(int u) {
sort(G[u].begin(), G[u].end(), [&](int i, int j) {return min_subtree[i] < min_subtree[j];});
for (auto v : G[u]) {
dfs2(v);
}
order.push_back(u); pos[u] = order.size()-1;
}
int f(int u, int x) {
for (int i = 0; i < MAXLOG; i++) if (x & 1<<i) u = up[u][i];
return u;
}
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> q;
G.assign(n, vector<int>()); up.assign(n, vector<int>(MAXLOG));
min_subtree.assign(n, 1e9); tin.assign(n,0); tout.assign(n, 0); pos.assign(n, 0);
int root = -1;
for (int i = 0; i < n; i++) {
int x; cin >> x;
if (x>0) G[x-1].push_back(i);
else root = i;
}
dfs1(root, root);
dfs2(root);
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
for (int i = 0; i < n; i++) pq.push({pos[i], i});
auto fenw = Fenw(2*n+2);
while (q--) {
int t; cin >> t;
if (t == 1) {
int k; cin >> k;
int l = 0;
while (k--) {
auto [p, u] = pq.top(); pq.pop();
fenw.update(tin[u], tout[u], 1);
l = u;
}
cout << l+1 << "\n";
} else {
int x; cin >> x;
--x;
int above = fenw.query(tin[x])-1;
int v = f(x, above);
fenw.update(tin[v], tout[v], -1);
pq.push({pos[v], v});
cout << above << "\n";
}
}
return 0;
}