#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
const int M=1<<18;
vector<int> adj[N];
int s[M],lz[M],ti,dp[N],c[N],d[N][18],rv[N],dep[N];
void build(int l,int r,int idx){
lz[idx]=-1;
if(l==r){
s[idx]=1;
return;
}
int m=(l+r)/2;
build(l,m,idx*2);
build(m+1,r,idx*2+1);
s[idx]=s[idx*2]+s[idx*2+1];
}
void pushlz(int l,int r,int idx){
if(lz[idx]==-1) return;
s[idx]=(r-l+1)*lz[idx];
if(l!=r) lz[idx*2]=lz[idx],lz[idx*2+1]=lz[idx];
lz[idx]=-1;
}
void update(int l,int r,int idx,int a,int b,int val){
pushlz(l,r,idx);
if(a>r || b<l) return;
if(a<=l && b>=r){
lz[idx]=val;
pushlz(l,r,idx);
return;
}
int m=(l+r)/2;
update(l,m,idx*2,a,b,val);
update(m+1,r,idx*2+1,a,b,val);
s[idx]=s[idx*2]+s[idx*2+1];
}
int query(int l,int r,int idx,int a,int b){
pushlz(l,r,idx);
if(a>r || b<l) return 0;
if(a<=l && b>=r) return s[idx];
int m=(l+r)/2;
return query(l,m,idx*2,a,b)+query(m+1,r,idx*2+1,a,b);
}
int walk(int l,int r,int idx,int k){
pushlz(l,r,idx);
if(l==r) return l;
int m=(l+r)/2;
pushlz(l,m,idx*2),pushlz(m+1,r,idx*2+1);
if(s[idx*2]<k) return walk(m+1,r,idx*2+1,k-s[idx*2]);
return walk(l,m,idx*2,k);
}
void dfs(int u){
dp[u]=u;
for(auto v:adj[u]){
dep[v]=dep[u]+1;
dfs(v);
dp[u]=min(dp[u],dp[v]);
}
}
void efs(int u){
for(auto v:adj[u]){
efs(v);
}
c[u]=ti++;
rv[c[u]]=u;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n,q; cin>>n >>q;
int rt;
for(int i=1;i<=n;i++){
int x; cin>>x;
if(x==0) rt=i,d[i][0]=i;
else{
adj[x].push_back(i);
d[i][0]=x;
}
}
for(int i=1;i<18;i++){
for(int j=1;j<=n;j++){
d[j][i]=d[d[j][i-1]][i-1];
}
}
dfs(rt);
for(int i=1;i<=n;i++){
sort(adj[i].begin(),adj[i].end(),[&](int x,int y){
return dp[x]<dp[y];
});
}
efs(rt);
build(0,ti-1,1);
//for(int i=0;i<ti;i++) cout<<query(0,ti-1,1,i,i) <<"\n";
while(q--){
int t,k; cin>>t >>k;
if(t==1){
int id=walk(0,ti-1,1,k);
cout<<rv[id] <<"\n";
update(0,ti-1,1,0,id,0);
}
else{
int now=k;
for(int i=17;i>=0;i--){
if(query(0,ti-1,1,c[d[now][i]],c[d[now][i]])==0) now=d[now][i];
}
cout<<dep[k]-dep[now] <<"\n";
update(0,ti-1,1,c[now],c[now],1);
}
// for(int i=0;i<ti;i++) cout<<query(0,ti-1,1,i,i) <<" ";
// cout<<"\n";
}
}