#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
vector<int> ds[MAXN];
int fen[MAXN],sub[MAXN],pos[MAXN],P[MAXN],sp[MAXN][20],cnt=0;
bool comp(int a,int b) { return sub[a]<sub[b]; }
int getlog(long long n) { return 63-__builtin_clzll(n); }
void update(int i,int n,int val) { for(;i<=n;i+=i&-i) fen[i]+=val; }
int get(int i) { int ans=0;for(;i;i-=i&-i) ans+=fen[i];return ans; }
int walk(int n,int val) { int ans=0;for(int i=getlog(n);i+1;i--) if(ans+(1<<i)<=n&&val>=fen[ans+(1<<i)]) val-=fen[ans+=(1<<i)];return ans+1; }
void dfs(int i,int pre)
{
sub[i]=i;
for(auto v:ds[i])
{
dfs(v,i);
sub[i]=min(sub[i],sub[v]);
}
sort(ds[i].begin(),ds[i].end(),comp);
}
void dfs2(int i,int pre)
{
sp[i][0]=pre;
for(int j=1;j<=17;j++) sp[i][j]=sp[sp[i][j-1]][j-1];
for(auto v:ds[i]) dfs2(v,i);
pos[i]=++cnt,P[cnt]=i;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,q,root=-1;
cin>>n>>q;
for(int i=1;i<=n;i++)
{
int res;
cin>>res;
if(!res) root=i;
else ds[res].push_back(i);
}
dfs(root,root);
dfs2(root,0);
for(int i=1;i<=n;i++) update(i,n,1);
for(int i=1;i<=q;i++)
{
int t,v;
cin>>t>>v;
if(t==1)
{
while(v--)
{
int p=walk(n,0);
update(p,n,-1);
if(!v) cout<<P[p]<<"\n";
}
}
else
{
int ans=0;
for(int j=17;j+1;j--) if(sp[v][j]&&get(pos[sp[v][j]])==get(pos[sp[v][j]]-1)) v=sp[v][j],ans+=(1<<j);
cout<<ans<<"\n";
update(pos[v],n,1);
}
}
}