#include<bits/stdc++.h>
using namespace std;
vector<int> to[100001],s[100001];
struct question{
int c;
vector<int> q;
}_[100001];
bool cmp(question _1,question _2){return _1.c>_2.c;}
int d[200001],now;
bool vis[100001],vis1[100001];
pair<int,int> p[100001];
void dfs(int u,int shen)
{
vis1[u]=1;
d[++now]=u;
p[u].first=now;
s[shen].push_back(now);
int len=to[u].size();
for(int i=0;i<len;i++)if(!vis1[to[u][i]])dfs(to[u][i],shen+1);
d[++now]=u;
p[u].second=now;
}
int tree[800001];
void change(int node,int l,int r,int w)
{
if(l==r)
{
vis[l]=1;
tree[node]=1;
return ;
}
int mid=(l+r)/2;
if(w<=mid)change(node*2,l,mid,w);
else change(node*2+1,mid+1,r,w);
tree[node]=tree[node*2]+tree[node*2+1];
return ;
}
int get(int node,int l,int r,int ll,int rr)
{
if(l>=ll&&r<=rr)return tree[node];
int mid=(l+r)/2;
int cnt=0;
if(ll<=mid)cnt+=get(node*2,l,mid,ll,rr);
if(rr>mid)cnt+=get(node*2+1,mid+1,r,ll,rr);
return cnt;
}
int main(){
freopen("tree2.in","r",stdin);
freopen("tree.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
int u,v;
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
to[u].push_back(v);
to[v].push_back(u);
}
int op,x,cnt=0;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&op,&x);
if(op==1)_[++cnt].c=x;
else _[cnt].q.push_back(x);
}
sort(_+1,_+1+cnt,cmp);
dfs(1,1);
for(int i=1;i<=cnt;i++)
{
int len=s[_[i].c].size();
for(int j=0;j<len;j++)
{
int k=s[_[i].c][j];
if(vis[k])break;
while(k<=p[d[s[_[i].c][j]]].second)
{
change(1,1,2*n,k);
if(vis[k+1])k=p[d[k]].second;
else k++;
}
}
int qlen=_[i].q.size();
for(int j=0;j<qlen;j++)
{
printf("%d\n",get(1,1,2*n,p[_[i].q[j]].first,p[_[i].q[j]].second)/2);
}
}
return 0;
}