#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int f=1,res=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){res=(res<<1)+(res<<3)+(c^48);c=getchar();}
return res*f;
}
void write(int x)
{
if(x<0){putchar('-');x=-x;}
if(x>9)write(x/10);
putchar(x%10+'0');
}
struct node
{
int nxt,to;
}e[114514<<1];
int head[114514],cnt_edge;
void add_edge(int u,int v)
{
e[++cnt_edge].to=v;
e[cnt_edge].nxt=head[u];
head[u]=cnt_edge;
}
int n,m;
int dep[114514];
int rt[114514];
struct segt
{
int ls,rs,val;
}t[114514<<6];
int cnt;
#define mid ((l+r)>>1)
void update(int root)
{
t[root].val=t[t[root].ls].val+t[t[root].rs].val;
}
int insert(int x,int l,int r,int root)
{
if(!root)
root=++cnt;
if(l==r)
{
++t[root].val;
return root;
}
if(x<=mid)
t[root].ls=insert(x,l,mid,t[root].ls);
else
t[root].rs=insert(x,mid+1,r,t[root].rs);
update(root);
return root;
}
int merge(int x,int y,int l,int r)
{
if(!x||!y)
return x|y;
int cur=++cnt;
if(l==r)
{
t[cur].val=t[x].val+t[y].val;
return cur;
}
t[cur].ls=merge(t[x].ls,t[y].ls,l,mid);
t[cur].rs=merge(t[x].rs,t[y].rs,mid+1,r);
update(cur);
return cur;
}
int query(int x,int y,int l,int r,int root)
{
if(!root)
return 0;
if(l>=x&&r<=y)
return t[root].val;
int res=0;
if(x<=mid)
res+=query(x,y,l,mid,t[root].ls);
if(y>mid)
res+=query(x,y,mid+1,r,t[root].rs);
return res;
}
void dfs1(int u,int fa)
{
dep[u]=dep[fa]+1;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(v==fa)
continue;
dfs1(v,u);
}
}
void dfs2(int u,int fa)
{
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].to;
if(v==fa)
continue;
dfs2(v,u);
rt[u]=merge(rt[u],rt[v],1,1e5);
}
}
int last=0;
int main()
{
n=read(),m=read();
for(int i=1;i<n;i++)
{
int u=read(),v=read();
add_edge(u,v);
add_edge(v,u);
}
dfs1(1,0);
for(int i=1;i<=n;i++)
rt[i]=insert(dep[i],1,1e5,rt[i]);
dfs2(1,0);
for(int i=1;i<=m;i++)
{
int op=read(),x=read();
if(op==1)
last=x;
else
write(query(last,1e5,1,1e5,rt[x])),puts("");
}
}