#include <set>
#include <queue>
#include <iostream>
const int N = 1e5 + 10;
bool son[N];
std::set<std::pair<int, int>> node;
int n, q, s, cnt, fa[N], dfn[N], f[N][20];
void dfs(int u) {
if (!son[u]) {
node.insert({dfn[u] = ++cnt, u});
return ;
}
for (auto v : son[u]) dfs(v);
node.insert({dfn[u] = ++cnt, u});
}
void init() {
for (int j = 0; j < 20; ++j)
for (int i = 1; i <= n; ++i) {
if (!j) f[i][j] = fa[i];
else f[i][j] = f[f[i][j - 1]][j - 1];
}
}
int main() {
std::cin.tie(0)->sync_with_stdio(0);
std::cin >> n >> q;
for (int i = 1, x; i <= n; ++i)
std::cin >> x, fa[i] = x, son[x] = true;
for (int i = 1; i <= n; ++i)
if (!fa[i]) { s = i; break; }
dfs(s), init();
for (int opt, num; q; --q) {
std::cin >> opt >> num;
if (opt == 1) {
for (int i = 1; i < num; ++i) node.erase(node.begin());
std::cout << node.begin()->second << '\n', node.erase(node.begin());
} else {
int t = num, len = 0;
for (int i = 19; ~i; --i) {
if (!f[t][i] || node.find({dfn[f[t][i]], f[t][i]}) != node.end()) continue;
t = f[t][i], len += 1 << i;
}
node.insert({dfn[t], t});
std::cout << len << '\n';
}
}
std::cout.flush();
return 0;
}