#include <iostream>
#include <math.h>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <iomanip>
#include <set>
#include <bitset>
#include <tuple>
#include <functional>
using namespace std;
using ll = long long;
using pii = pair<int,int>;
using piii = tuple<int,int,int>;
using piiii = tuple<int,int,int,int>;
#define endl '\n'
#define f first
#define s second
#define all(x) begin(x),end(x)
int const N = 2e5+10;
int const LN = 18;
int const INF = 1e9+10;
int fenwick[N];
int si;
void update(int n,int val){
for(;n <= si;n += n&-n) fenwick[n] += val;
}
int query(int n){
int sum = 0;
for(;n > 0;n -= n&-n) sum += fenwick[n];
return sum;
}
vector<int> adj[N];
vector<pii> order[N];
int lca[N][LN];
int depth[N];
int rtime[N];
int posttime[N];
int minval[N];
bool curval[N];
int t = 1;
void dfs1(int n){
minval[n] = n;
for(auto k:adj[n]){
depth[k] = depth[n]+1;
dfs1(k);
minval[n] = min(minval[k],minval[n]);
order[n].emplace_back(minval[k],k);
}
sort(all(order[n]));
}
void dfs2(int n){
for(auto [w,k]:order[n]){
dfs2(k);
}
posttime[n] = t++;
rtime[posttime[n]] = n;
}
int findfirst(){
int l = 1;
int r = si;
int ans = r;
while(l <= r){
int md = l+(r-l)/2;
if(query(md) < md) ans = min(ans,md),r = md-1;
else l = md+1;
}
return ans;
}
int main(){
int n;cin >> n;
si = n;
int q;cin >> q;
int root;
for(int i{1};i <= n;i++){
cin >> lca[i][0];
if(lca[i][0] == 0) root = i,lca[i][0] = i;
else adj[lca[i][0]].emplace_back(i);
}
for(int i{1};i < LN;i++){
for(int j{1};j <= n;j++){
lca[j][i] = lca[lca[j][i-1]][i-1];
}
}
dfs1(root);
dfs2(root);
for(int i{};i < q;i++){
int t,b;cin >> t >> b;
if(t == 1){
int last;
for(int i{};i < b;i++){
int pos = findfirst();
last = rtime[pos];
curval[last] = 1;
update(pos,1);
}
cout << last << endl;
}
else if(t == 2){
int cur = b;
for(int i{LN-1};i >= 0;i--){
//cout << cur << " " << curval[cur] << endl;
if(curval[lca[cur][i]]) cur = lca[cur][i];
}
//cout << cur << "-" << endl;
curval[cur] = 0;
update(posttime[cur],-1);
cout << depth[b]-depth[cur] << endl;
}
}
}