#include <bits/stdc++.h>
//#include "incursion.h"
using namespace std;
const int N=2e5+1;
const int M=21;
#define ll long long
int a[N];
int p[N];
vector<int> g[N];
int up[N][M];int sz[N];
int dep[N];
int dp[N];
int fl[N];
int dp_rev[N];
void dfs(int v,int p){
dep[v]=dep[p]+1;
up[v][0]=p;
for(int i=1;i<M;++i){
up[v][i]=up[up[v][i-1]][i-1];
}
sz[v]=1;
for(auto i:g[v]){
if(i==p){
continue;
}
dfs(i,v);
sz[v]+=sz[i];
}
}
void dfs1(int v,int p,int c){
for(auto i:g[v]){
if(i==p){
continue;
}
dfs1(i,v,c);
c+=sz[i];
}
dp[v]=c;
dp_rev[c]=v;
}
int main(){
int n,q;
cin>>n>>q;
int root;
for(int i=1;i<=n;++i){
cin>>p[i];
if(p[i]==0){
root=i;
}
g[p[i]].push_back(i);
g[i].push_back(p[i]);
}
for(int i=1;i<=n;++i){
sort(g[i].begin(),g[i].end());
}
dfs(root,0);
dfs1(root,0,0);
set<int> cl;
for(int i=0;i<n;++i){
cl.insert(i);
}
while(q--){
int type,k;
cin>>type>>k;
if(type==1){
for(int i=1;i<=k;++i){
fl[dp_rev[*cl.begin()]]=1;
if(i==k){
cout<<dp_rev[*cl.begin()]<<'\n';
}
cl.erase(cl.begin());
}
continue;
}
int v=k;
int x=0;
for(int j=M-1;j>=0;--j){
if(fl[up[v][j]]){
v=up[v][j];
x+=(1<<j);
}
}
fl[v]=0;
cl.insert(dp[v]);
cout<<x<<'\n';
}
return 0;
}